MFC学习笔记——多窗口之间的通信 .

来源:互联网 发布:天下三捏脸数据女魍魉 编辑:程序博客网 时间:2024/06/15 23:53

简单概要

本篇文章依然是关于 消息机制 的文章,在上一章说到了使用线程来和窗口之间进行通信,今天就说一下两个窗口之间进行通信的原理。

预备知识

你得知道什么是 消息机制,或者你读了我上一章。

具体步骤

新建一个工程,名称为“MultiWindows”,使用 Unicode 编码。具体界面可以如下:
首先添加一个新的窗口并将界面布局为下图,具体方法如下:

在添加好窗口之后还要为这个窗口添加一个类文件,具体方法可如下:


添加完成之后就可以添加消息功能了,这次有所不同的是,在以往的文章里都是只有一个窗口,而消息也都是在一个窗口内。如今变成了两个窗口,为了使两个窗口都知道对方的消息ID是什么,所以决定在.h文件中声明消息ID(以前是在*Dlg.h中声明),具体添加方法如之前的文章所说,只是在声明的时候换一个位置。具体消息为
主窗口消息:

子窗口消息为:

添加完消息之后,可以到 工程名.h 中声明消息ID了。 

[cpp] view plaincopyprint?
  1. #define WM_MAIN_MSG WM_USER+0x01001  
  2. #define WM_SUB_MSG WM_USER+0x02001  
之后再在 工程名Dlg.h 中声明子窗口的窗口句柄变量
主窗口上的“打开子窗口(&O)”和“向子窗口发送消息(&S)”添加单击代码:
[cpp] view plaincopyprint?
  1. // 打开子窗口(&O)   
  2. void CMultiWindowsDlg::OnBnClickedButton1()  
  3. {  
  4.     if (dlg == NULL)   
  5.     {  
  6.         dlg = new CMySubDialog();  
  7.         dlg->Create(IDD_DIALOG1,this);  
  8.     }  
  9.   
  10.     if (dlg == NULL) return (void)MessageBox(_T("子窗口的句柄为空!"));  
  11.     dlg->ShowWindow(SW_SHOWNORMAL);  
  12. }  
  13.   
  14. // 向子窗口发送消息(&S)   
  15. void CMultiWindowsDlg::OnBnClickedButton2()  
  16. {  
  17.     CString strEdit;  
  18.     GetDlgItemText(IDC_EDIT1,strEdit);  
  19.   
  20.     if (dlg == NULL) return (void)MessageBox(_T("子窗口的句柄为空!"));  
  21.     dlg->SendMessage(WM_SUB_MSG,(WPARAM)&strEdit);  
  22. }  
然后给主窗口的消息添加代码:
[cpp] view plaincopyprint?
  1. afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     CString* strMsg = (CString*)wParam;  
  4.     SetDlgItemText(IDC_EDIT1,*strMsg);  
  5.     return 0;  
  6. }  
以同样的方法给子对话框的"向父窗口发送消息(&S)"和消息添加代码
[cpp] view plaincopyprint?
  1. // 消息代码   
  2. afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam)  
  3. {  
  4.     // 将 wParam 强制转换为 CString 类型   
  5.     CString* strMsg = (CString*)wParam;  
  6.   
  7.     // 设置对话框中编辑框的文本   
  8.     SetDlgItemText(IDC_EDIT1,*strMsg);  
  9.   
  10.     return 0;  
  11. }  
  12.   
  13. // 向父窗口发送消息(&S)   
  14. void CMySubDialog::OnBnClickedButton1()  
  15. {  
  16.     // 获得编辑框中的文本   
  17.     CString strEdit;  
  18.     GetDlgItemText(IDC_EDIT1,strEdit);  
  19.   
  20.     // 获得父窗口的句柄   
  21.     HWND hWnd = this->GetParent()->GetSafeHwnd();  
  22.   
  23.     // 向父窗口发送消息   
  24.     if (hWnd == NULL) return (void)MessageBox(_T("获得父窗口句柄失败!"));  
  25.     ::SendNotifyMessage(hWnd,WM_MAIN_MSG,(WPARAM)&strEdit,NULL);  
  26. }  

编译运行



总结拓展

其实消息的用处是很广的,不只是在这里可以体现!

事例下载

下载地址:点击下载
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大专挂科太多学校让延期毕业怎么办 安卓手机老是收到垃圾短信怎么办 高铁站行李拉安检仪上应该怎么办 连壁金融立案了投资钱怎么办 联壁金融倒了投资人的钱怎么办 改签的高铁票错过了怎么办 高铁票错过了当天没别的车次怎么办 电脑文件剪切到u盘不见了怎么办 电脑剪切到u盘然后打不开了怎么办 淘宝未满十八岁限制购买物品怎么办 网上飞机订票手机号填写错了怎么办 室外回填土都是砂土压不实怎么办 王牌车新车储气筒漏气查不到怎么办 顺丰快递保价后商品出现问题怎么办 未保价快递丢失没有价值证明怎么办 安卓手机谷歌地图怎么用不了怎么办 ae模板版本太高打不开怎么办 苹果手机高德地图信号弱怎么办 网上订好火车票后没赶上火车怎么办 丰巢快递柜没收到短信怎么办 被不同号码骚扰电话打个不停怎么办 手机注册被骚扰电话打个不停怎么办 网贷不停的打骚扰电话怎么办 发改委的可研报告过期了怎么办 买到没有预售证的房子怎么办 网上买的学生票取不出来怎么办 买完学生票发现打折没次数了怎么办 动车晚点方向来反了怎么办 身份证购买高铁票过不了审核怎么办 手机购买高铁票身份核验失败怎么办 在高铁上如果有人占了座位该怎么办 网上买的高铁票改签怎么办 临沂村委会强行征收我的土地怎么办 学籍验证码连续输入三次错误怎么办 社保在上海个税在外地居转户怎么办 父母已经有英国签证孩子的怎么办 营运车辆被撞不肯赔务工费怎么办 欧米茄外壳上装表带的孔穿了怎么办 淘宝上买了电子产品坏了怎么办 研究生人才补助申请期限过了怎么办 一个小孩亲妈愿意养躲起来怎么办