实现从一个窗口向另一个窗口发送消息,使用过下面两种方法

/*方法一:通过用SDK的标准API来查找其他对话框窗口返回句柄,并且发送信息
HWND hWnd;

//通过SDK的FindWindow函数得到目标窗口的句柄,TriTest为目标串口的Caption的值

if(!(hWnd = ::FindWindow(NULL,"TriTest")))

AfxMessageBox("Error!");

//通过SDKSendMessage向目标窗口发送EDGE_MESSAGE消息,此消息在staafx.h中已经定义
 ::SendMessage(hWnd,EDGE_MESSAGE,0,0);

/*方法二:通过运用MFC自身封装好的CWnd中的函数(跟标准API有一些不同)实现,不同之处在于省略了标准API第一个参数*/
 CWnd* pWnd = CWnd::FindWindow(NULL,"TriTest");
 if(pWnd == NULL)
  AfxMessageBox("Error!");
 pWnd->SendMessage(EDGE_MESSAGE,0,0);

但是这次使用MFC在后台工作线程使用这两种方法发送消息的时候,有时候发送成功,有时候发送失败,最终没有找到原因,师兄说可能是窗口切换的时候出现了问题,最后提供了一种很灵巧的解决方案:

首先定义了消息MY_MSG,消息响应函数MT_Test,并关联了消息响应函数,当单击按钮时:

#define  MY_MSG WM_USER+1
afx_msg LRESULT MT_Test(WPARAM wParam,LPARAM lParam);
ON_MESSAGE(MY_MSG, &CMT_MFCDlg::MT_Test)

void CMT_MFCDlg::OnBnClickedButton1()
{
 AfxBeginThread(Caculate,this);//在这里把这个对象(例程/实例)的指针传给线程函数
}

Caculate线程工作函数如下:

UINT Caculate(LPVOID pParam)
{
 AfxMessageBox("Come here");

CMT_MFCDlg* c = (CMT_MFCDlg *)pParam; //通过传来的对象指针直接向这个对象发消息,肯定可以收到
 c->SendMessage(MY_MSG,i,0);
 return 0;
}

消息响应函数如下:

LRESULT CMT_MFCDlg::MT_Test(WPARAM wParam,LPARAM lParam)
{
 AfxMessageBox("Receive MY_MSG");      //如果收到消息弹出对话框提示

return 0;
}
        经过这样的控制,每次都可以发送成功消息。

这里巧妙运用了this指针和函数传递指针类型参数--->LPVOID--->强制转换回来,之后发送消息。

关于this我理解如下:关于this指针的一个经典回答:
        当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。

C++中的每个对象(实例)都有一个隐藏的this指针,在MFC中可以再线程处理函数里利用这个指针,向这个实例发送消息进行处理。

我是米洛,十年软件开发老司机,觉得文章有用,请点转载,赠人玫瑰,手有余香。

    

MFC实现从一个窗口向另一个窗口发送消息的两种方法相关推荐

  1. jmeter提取多个变量的多个值_jmeter用一个正则提取器提取多个值的两种方法

    jmeter中,用json提取器,一次提取多个值,这个很多人都会.但是,用正则提取器一次提取多个,是否可以呢? 肯定,很多人都自信满满的说,可以!形如:token":"(.*?)& ...

  2. 编写一个计算机矩形的周长和面积的程序 两种方法

    编写一个计算机矩形的周长和面积的程序 操作步骤 方法一 基础篇 leight = int(input("输入矩形的长:")) width = int(input("输入矩 ...

  3. 34. 在排序数组中查找元素的第一个和最后一个位置012(二分查找+思路+详解+两种方法)Come Baby!!!!!!!! !

    一:题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返回 [-1, -1]. 进阶: 你 ...

  4. python读取png图片只有一个图层_python实现读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...

  5. Response.Redirect 打开新窗口的两种方法

    一般情况下,Response.Redirect 方法是在服务器端进行转向,因此,除非使用 Response.Write("<script>window.location='htt ...

  6. (转)Response.Redirect 打开新窗口的两种方法

    一般情况下,Response.Redirect 方法是在服务器端进行转向,因此,除非使用 Response.Write("<script>window.location='htt ...

  7. [导入]Response.Redirect 打开新窗口的两种方法

    一般情况下,Response.Redirect 方法是在服务器端进行转向,因此,除非使用 Response.Write("<script>window.location='htt ...

  8. c语言求出两个最大素数,求两个正整数的最大公约数      思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y...

    求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) ( ...

  9. 多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...

    在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title ...

最新文章

  1. ASP.NET程序中常用代码汇总(一)
  2. SpringCloud--Eureka服务注册与发现 Eureka 集群搭建 详细案例!!!
  3. php echo表单提交_PHP常见面试题及答案
  4. CSS3动画@keyframes中translate和scale混用出错问题
  5. Android学习视频集合
  6. Msm8937+android7.1.1编译环境搭建及编译
  7. 【论文阅读】深度学习与多种机器学习方法在不同的药物发现数据集进行对比
  8. 案例|工业物联网解决方案·光伏电站
  9. 如何介绍自己的项目经验?
  10. 上课笔记-机器学习(5)-美国人口普查数据进行收入预测分类
  11. 身边已经消失或走在消失路上的可爱小动物
  12. H264 Annex B 与 AVCC的区别
  13. extern C 介绍(转)
  14. MVVMLight Dialog
  15. 2022-07-06 Unity核心9——3D动画
  16. 树莓派ssh远程连接
  17. 组态王能直接读取仪表数据吗_关于组态王读取非标准协议设备数据的应用
  18. PHP基础学习(1)
  19. TH-OCR文字识别SDK 12.X介绍
  20. 多边形凹凸性的判断、自相交判断

热门文章

  1. 震荡间断点与导函数不连续
  2. 【柜子设计】草图大师及插件AFU321安装
  3. 简述计算机蓝屏的主要原因,常见电脑蓝屏的原因有什么
  4. Vue禁用button
  5. 微信小程序云开发-树洞小程序Treehole(评论帖子/发布话题实现)
  6. R包circlize:柱状图用腻了?试试好看的弦状图
  7. Winform 将Ico图标转换为PNG图片
  8. 理工科er怎么发一作SCI
  9. 防作弊-页面失焦与禁键
  10. 云服务器搭建减少物流信息成本,摩方谈物流运输:10大措施,控制物流运输成本!...