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

/*方法一:通过用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. Python基础教程:元组详细使用
  2. NS2仿真分析无线网络的攻击防御(2)
  3. SpringBoot中使用Shiro和JWT做认证和鉴权
  4. 关于SQL Server 2005服务无法启动,报3417错误。(附带重装SQL时解决COM+目录问题)(转帖)
  5. OpenCV-3.4.3图像通道处理
  6. Fisker大师用ZBrush制作兽人萨尔全过程
  7. 分析 AlphaGo 算法原理的本质
  8. netware php_服务器_如何在 Netware 服务器中安装多块网卡,如果网络在扩大时服务器只装 - phpStudy...
  9. 微信程序开发系列教程(二)微信订阅号+人工智能问答服务
  10. hooks-riverpod 使用
  11. js 将秒数换算成时分秒
  12. 人脸识别: 人脸数据集大全
  13. windows黑客编程系列(十一):按键记录
  14. 游侠安全网-安全产品和厂家调研-欢迎补充
  15. 「Arm Arch」 ISA 指令集
  16. centos常用命令
  17. 第二届IECIE上海蒸汽文化周电子烟展即将开幕
  18. 教程:使用PySpark和MapR沙盒
  19. 【IE】信息抽取任务简述
  20. Flutter学习笔记:identical函数的用法以及常量构造函数的特点

热门文章

  1. Git 操作遇到 Found a swap file by the name “~/xxxx/.git/. COMMIT_EDI_TMSG. Swp“
  2. JAVA-IDEA报错:Error:Cannot run program “C:\Program Files\Java\jdk1.8.0_20\bin\java.exe“
  3. iPhone丢了怎么找回
  4. Mathtype 6.9 公式编辑时出现一些符号显示为方框
  5. mysql字段的长度_MySQL字段的长度
  6. CentOS7下配置域名解析服务器
  7. linux内存和磁盘空间不足解决办法
  8. 码农老黄历-看今天哪个方位BUG最少
  9. CefInitialize崩溃 Cef白屏
  10. 工控系统信息安全技术国家工程实验室建设取得阶段性成果