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 ...
最新文章
- Python基础教程:元组详细使用
- NS2仿真分析无线网络的攻击防御(2)
- SpringBoot中使用Shiro和JWT做认证和鉴权
- 关于SQL Server 2005服务无法启动,报3417错误。(附带重装SQL时解决COM+目录问题)(转帖)
- OpenCV-3.4.3图像通道处理
- Fisker大师用ZBrush制作兽人萨尔全过程
- 分析 AlphaGo 算法原理的本质
- netware php_服务器_如何在 Netware 服务器中安装多块网卡,如果网络在扩大时服务器只装 - phpStudy...
- 微信程序开发系列教程(二)微信订阅号+人工智能问答服务
- hooks-riverpod 使用
- js 将秒数换算成时分秒
- 人脸识别: 人脸数据集大全
- windows黑客编程系列(十一):按键记录
- 游侠安全网-安全产品和厂家调研-欢迎补充
- 「Arm Arch」 ISA 指令集
- centos常用命令
- 第二届IECIE上海蒸汽文化周电子烟展即将开幕
- 教程:使用PySpark和MapR沙盒
- 【IE】信息抽取任务简述
- Flutter学习笔记:identical函数的用法以及常量构造函数的特点
热门文章
- Git 操作遇到 Found a swap file by the name “~/xxxx/.git/. COMMIT_EDI_TMSG. Swp“
- JAVA-IDEA报错:Error:Cannot run program “C:\Program Files\Java\jdk1.8.0_20\bin\java.exe“
- iPhone丢了怎么找回
- Mathtype 6.9 公式编辑时出现一些符号显示为方框
- mysql字段的长度_MySQL字段的长度
- CentOS7下配置域名解析服务器
- linux内存和磁盘空间不足解决办法
- 码农老黄历-看今天哪个方位BUG最少
- CefInitialize崩溃 Cef白屏
- 工控系统信息安全技术国家工程实验室建设取得阶段性成果