MFC实现从一个窗口向另一个窗口发送消息的两种方法
实现从一个窗口向另一个窗口发送消息,使用过下面两种方法
/*方法一:通过用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实现从一个窗口向另一个窗口发送消息的两种方法相关推荐
- jmeter提取多个变量的多个值_jmeter用一个正则提取器提取多个值的两种方法
jmeter中,用json提取器,一次提取多个值,这个很多人都会.但是,用正则提取器一次提取多个,是否可以呢? 肯定,很多人都自信满满的说,可以!形如:token":"(.*?)& ...
- 编写一个计算机矩形的周长和面积的程序 两种方法
编写一个计算机矩形的周长和面积的程序 操作步骤 方法一 基础篇 leight = int(input("输入矩形的长:")) width = int(input("输入矩 ...
- 34. 在排序数组中查找元素的第一个和最后一个位置012(二分查找+思路+详解+两种方法)Come Baby!!!!!!!! !
一:题目 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目标值 target,返回 [-1, -1]. 进阶: 你 ...
- python读取png图片只有一个图层_python实现读取并显示图片的两种方法
在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...
- Response.Redirect 打开新窗口的两种方法
一般情况下,Response.Redirect 方法是在服务器端进行转向,因此,除非使用 Response.Write("<script>window.location='htt ...
- (转)Response.Redirect 打开新窗口的两种方法
一般情况下,Response.Redirect 方法是在服务器端进行转向,因此,除非使用 Response.Write("<script>window.location='htt ...
- [导入]Response.Redirect 打开新窗口的两种方法
一般情况下,Response.Redirect 方法是在服务器端进行转向,因此,除非使用 Response.Write("<script>window.location='htt ...
- c语言求出两个最大素数,求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y...
求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) ( ...
- 多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...
在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title ...
最新文章
- ASP.NET程序中常用代码汇总(一)
- SpringCloud--Eureka服务注册与发现 Eureka 集群搭建 详细案例!!!
- php echo表单提交_PHP常见面试题及答案
- CSS3动画@keyframes中translate和scale混用出错问题
- Android学习视频集合
- Msm8937+android7.1.1编译环境搭建及编译
- 【论文阅读】深度学习与多种机器学习方法在不同的药物发现数据集进行对比
- 案例|工业物联网解决方案·光伏电站
- 如何介绍自己的项目经验?
- 上课笔记-机器学习(5)-美国人口普查数据进行收入预测分类
- 身边已经消失或走在消失路上的可爱小动物
- H264 Annex B 与 AVCC的区别
- extern C 介绍(转)
- MVVMLight Dialog
- 2022-07-06 Unity核心9——3D动画
- 树莓派ssh远程连接
- 组态王能直接读取仪表数据吗_关于组态王读取非标准协议设备数据的应用
- PHP基础学习(1)
- TH-OCR文字识别SDK 12.X介绍
- 多边形凹凸性的判断、自相交判断