版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——MFC用户自定义消息SendMessage的使用用户自定义消息SendMessage的使用
这里主要讲一下mfc中SendMessage的使用方法。传递消息主要分4步:1.在类的定义中声明消息函数:afx_msgvoidAAA();2.在相应的
cpp
文件中的
MESSAGE_MAP
区域内添加
ON_MESSAGE(MESSAGE_ID,AAA),其中参数1为要传递消息的ID,参数2为刚刚声明的函数名称,不用带括号。
3.实现消息函数:在cpp文件中添加
LRESULT类名::AAA(WPARAMwparam,LPARAMlparam){
执行内容……return0;}
4.发送消息:在需要发送消息的地方添加以下语句:
HWNDhWnd=::FindWindowEx(m_hWnd,NULL,NULL,WINDOW_TEXT);FromHandle(hWnd)->SendMessage(MESSAGE_ID,a,b);
其中,m_hWnd为接收消息的父窗口的句柄,WINDOW_TEXT为接收消息窗口的标题,得到的hWnd为接收消息窗口的句柄。调用该窗口的SendMessage函数,MESSAGE_ID为刚刚设定的消息ID,a和b是要传递的参数。
注:在这4个步骤中,前三个我在做的时候基本没什么障碍。问题主要出现在第4步。开始找到网上的例子给的都是FindWindow函数,怎么用都不好使。后来看到有人说FindWindow是找操作系统下开启的窗口的句柄,找窗口中子窗口要用FindWindowEx函数。我也尝试过用对话框的ID找到相应的句柄,像GetDlgItem(ID)函数一样,未果。我使用的对话框都是没有标题栏的,所以也就没有窗口的标题,当然这并不会影响我设置标题。只要在生成该窗口的区域内添加SetWindowText(“窗口标题〞)就可以了。也就是说窗口标题可以设置,但是不会显示。最终一点在SendMessage()函数中,MFC默认传递的参数是WPARAM和LPARAM型(一个是UINT型,一个LONG型),假使要传递浮点类型,或者其它不是整数的类型,就可以用指针的形式传递(假使发送方只是申请一个变量并以
地址的形式传递,然后接收方以指针的形式接收,假使在执行完SendMessage之后原函数体马上终止了,我不知道在接收函数体接收和使用该变量的之间的一瞬间,该内存区域会不会被占用,我觉得还是有这种可能的。所以我觉得还是在原函数体先申请一块内存,然后在接收函数使用完之后再释放该内存比较合理吧)。
在以下这个例子中是一个MFC的对话框应用程序,名字为MessageTest。它包括左边的一个发送对话框,和右边的两个接收对话框,其中发送对话框和接收对话框1分别是主对话框的子对话框,在接受对话框中有一个TabControl,在TabControl中有个接受对话框2。这么做的目的主要是为了理解如何找句柄的,为此我把几个对话框设置成深陷下去的便于观测。
准备工作:
1.手动添加1个设置全局变量的头文件GlobalSetting.h,这样做的目的是让所有的地方都能知道对话框的标题和自定义的结构。
2.在GlobalSetting.h中参与以下语句:
#defineRECEIVE1_TITLE\
#defineRECEIVE2_TITLE\#defineGET_INTWM_USER+1000#defineGET_DOUBLEWM_USER+1001#defineGET_STRINGWM_USER+1002#defineGET_STRUCTWM_USER+1003structSendStruct{
inta;intb;intc;intd;};
RECEIVE1_TITLE和RECEIVE2_TITLE定义两个接收对话框的标题,后边的4个GET_是4个消息ID,WM_USER是用户自定义消息的起始ID。
3.在各个需要使用这些内容的位置添加#include“GlobalSetting.h〞。4.在生成两个接受对话框的位置参与SetWindowText(RECEIVE1_TITLE)和SetWindowText(RECEIVE2_TITLE)。
例1:从发送对话框发送整数到接受对话框1中。1.在接受对话框1的类的定义中参与
afx_msgLRESULTGetInt(WPARAMwparam,LPARAMlparam);2.在对应的cpp文件中参与
ON_MESSAGE(GET_INT,Receive1Dlg::GetInt)3.在函数实现部分参与
LRESULTReceive1Dlg::GetInt(WPARAMwparam,LPARAMlparam){
CStringstr;
str.Format(\
CEdit*edit1=(CEdit*)GetDlgItem(IDC_EDIT1);edit1->SetWindowText(str);return0;}
4.在发送消息的函数中参与
inta=1;intb=2;HWND
hWnd=::FindWindowEx(this->GetParent()->m_hWnd,NULL,NULL,RECEIVE1_TITLE);
FromHandle(hWnd)->SendMessage(GET_INT,a,b);
注:在这个部分中只是简单地传递两个整数。第3步是将得到的两个整数显示到编辑框中,wparam和lparam假使是整数可以直接使用。第4步中
this->GetParent()->m_hWnd是找到了接收对话框1父窗口的句柄,将a和b的值发过去。
例2:从发送对话框发送小数到接受对话框1中。1.在接受对话框1的类的定义中参与
afx_msgLRESULTGetDouble(WPARAMwparam,LPARAMlparam);2.在对应的cpp文件中参与
ON_MESSAGE(GET_DOUBLE,Receive1Dlg::GetDouble)3.在函数实现部分参与
LRESULTReceive1Dlg::GetDouble(WPARAMwparam,LPARAMlparam){
CStringstr;
double*a=(double*)wparam;str.Format(\
CEdit*edit1=(CEdit*)GetDlgItem(IDC_EDIT1);edit1->SetWindowText(str);deletea;return0;}
4.在发送消息的函数中参与
double*a=newdouble;*a=1.111;
HWNDhWnd=::FindWindowEx(this->GetParent()->m_hWnd,NULL,NULL,RECEIVE1_TITLE);
FromHandle(hWnd)->SendMessage(GET_DOUBLE,(WPARAM)(a),0);
注:在这个部分中是传递1个小数。第3步是将得到的小数显示到编辑框中。第4步中先为double类型的变量申请一块内存并为其负值,然后以指针的形式发送消息过去。在第3步中首先获得double型指针,最终将内存释放。
例3:从发送对话框发送字符串到接受对话框2中。1.在接受对话框2的类的定义中参与
afx_msgLRESULTGetString(WPARAMwparam,LPARAMlparam);2.在对应的cpp文件中参与
ON_MESSAGE(GET_STRING,Receive2Dlg::GetString)3.在函数实现部分参与
LRESULTReceive2Dlg::GetString(WPARAMwparam,LPARAMlparam){
CString*str=(CString*)wparam;
}
CEdit*edit1=(CEdit*)GetDlgItem(IDC_EDIT1);edit1->SetWindowText(*str);deletestr;return0;
4.在发送消息的函数中参与
CString*p_str=newCString(\HWND
hWnd=::FindWindowEx(this->GetParent()->m_hWnd,NULL,NULL,RECEIVE1_TITLE);
hWnd=::FindWindowEx(FromHandle(hWnd)->GetDlgItem(IDC_TAB1)->m_hWnd,NULL,NULL,RECEIVE2_TITLE);
FromHandle(hWnd)->SendMessage(GET_STRING,(WPARAM)(p_str),0);
注:在这个部分中是传递1个字符串。第3步是将得到的字符串显示到编辑框中。第4步中先为CString类型的变量申请一块内存并为其赋值,然后以指针的形式发送消息过去。这个我在获得对话框句柄的时候遇到了一些问题,首先一定要弄明白各个窗口之间的父子关系,并知道对话框和控件获得句柄的方法是不同的。在这个例子中,接收对话框2的父窗口是那个TabControl,TabControl的父窗口是接收对话框1,接收对话框1和发送对话框拥有共同的父窗口。调理明了了就好写了。HWNDhWnd=::FindWindowEx(this->GetParent()->m_hWnd,NULL,NULL,RECEIVE1_TITLE);前边已经说过了,是获得了接收对话框1的句柄,下边那条语句中的FromHandle(hWnd)->GetDlgItem(IDC_TAB1)->m_hWnd是获得TabControl
的
句
柄
,
hWnd=::FindWindowEx(FromHandle(hWnd)->GetDlgItem(IDC_TAB1)->m_hWnd,NULL,NULL,RECEIVE2_TITLE);就是获得接收对话框2的句柄了。
例4:从发送对话框发送结构到接受对话框2中。1.在接受对话框1的类的定义中参与
afx_msgLRESULTGetStruct(WPARAMwparam,LPARAMlparam);2.在对应的cpp文件中参与
ON_MESSAGE(GET_STRUCT,Receive2Dlg::GetStruct)3.在函数实现部分参与
LRESULTReceive2Dlg::GetStruct(WPARAMwparam,LPARAMlparam){
SendStruct*ss=(SendStruct*)wparam;
}
CStringstr;
str.Format(\CEdit*edit1=(CEdit*)GetDlgItem(IDC_EDIT1);edit1->SetWindowText(str);free(ss);return0;
4.在发送消息的函数中参与
SendStruct*ss=(SendStruct*)malloc(sizeof(SendStruct));ss->a=1;ss->b=2;ss->c=3;ss->d=4;HWND
hWnd=::FindWindowEx(this->GetParent()->m_hWnd,NULL,NULL,RECEIVE1_TITLE);
hWnd
=::FindWindowEx(FromHandle(hWnd)->GetDlgItem(IDC_TAB1)->m_hWnd,NULL,NULL,RECEIVE2_TITLE);
FromHandle(hWnd)->SendMessage(GET_STRUCT,(WPARAM)(ss),0);
这个就不多做解释了。
错误的状况:下面说一下我在开始使用消息时使用错误的状况(我认为这是错的)。拿例2的第4步来说:
doublea=1.1111;
HWNDhWnd=::FindWindowEx(this->GetParent()->m_hWnd,NULL,NULL,RECEIVE1_TITLE);
FromHandle(hWnd)->SendMessage(GET_DOUBLE,(WPARAM)(第3步中去掉deletea;
我认为这是错的,为什么呢?好多时候在发送完成消息之后,函数体就终止了,a的内存就会被收回了,而消息接收的函数可能在很久的时间内都使用这个变量,说不定什么时候a的内存就被重新占用了。假使a是一个很巨大的对象,这种现象可能会更明显。
}
CStringstr;
str.Format(\CEdit*edit1=(CEdit*)GetDlgItem(IDC_EDIT1);edit1->SetWindowText(str);free(ss);return0;
4.在发送消息的函数中参与
SendStruct*ss=(SendStruct*)malloc(sizeof(SendStruct));ss->a=1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026下半年年高校招生就业服务专员大学教师招聘考试笔试试题(含答案)
- 行政执法证专业法律知识考试题库(综合类)及答案
- 小学六年级语文课外阅读《鲁滨逊漂流记》阅读测试题及答案
- 2026 年小暑节气防暑降温安全科普课件
- 2026年内蒙古嘎查村(社区)党组织书记公务员考试(行政职业能力和申论综合测验)考前冲刺试题及答案
- 房地产 -商业地产基础培训课件
- 电商运营经理销售目标绩效衡量表
- 医疗器械公司销售部年度销售业绩述职报告
- 铁岭市2025-2026学年数学四年级第二学期期末试题(含答案)
- 金家庄区2025届数学三年级第二学期期末教学质量检测试题(含答案解析)
- 幼儿园保安考试试题及答案
- 煤矿班组长现场安全管控培训课件
- 2023 电液伺服万能试验机
- 四川省水电投资经营集团有限公司所属电力公司2026年员工公开招聘(221人)考试备考试题及答案详解
- 初高中语文衔接教学课程设计方案
- LYT 3464-2026《退化草原免耕补播技术规程》(纯净版)
- 上海八年级上册数学-二次根式的乘法和除法 同步练习
- 胸痹常用中医护理技术详解
- 《方法系统论》教材
- 湖南钢铁集团秋招面试题及答案
- 《再生工业盐 氯化钠(征求意见稿)》
评论
0/150
提交评论