VC++ 学习笔记(11)——传递自定义消息
2010-06-23 20:17
253 查看
一、MFC中添加用户自定义消息
首先弄清楚两点:
(1)谁要发送这个消息(2)谁要接受这个消息。
用一个简单的例子来说明。对象A向B(也可以就是A到A)发送消息。
1 发送消息
首先在A的头文件中定义这个消息:
#define WM_USERMESSAGE WM_USER+100
所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的,为了防止冲突,选择稍大一点的自然数。A是向外发送消息的对象,因此在A的某个方法(函数)里就会调用用来发消息的函数B::SendMessage()/B::PostMessage(),因为是B接受消息,因此是如上的形式。
2 接受消息
对象接受一个消息,应该有三部分:在头文件中有该消息的处理函数的原型;在实现文件中有接受消息映射的宏;以及该消息的处理函数的具体实现。
2.1 头文件中加上自定义消息的处理函数原型
在DECLARE_MESSAGE_MAP()语句之前,一对AFX_MSG之间加上如下形式的函数原型:
afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam );
对Win32来说,wParam, lParam是传递消息最常用的手段。
2.2 在实现文件中加上接受消息映射的宏
在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加 如下形式的代码:
ON_MESSAGE(WM_USERMESSAGE, OnProcName)
上面是不用分号结尾的。
2.3 在实现文件中给出消息处理函数的具体实现。
二、在两个对话框之间传递消息
两个对话框Dlg1,和Dlg2,Dlg1发送消息到Dlg2,使用::SendMessage方法。
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。
本例中,Dlg1发送消息,dlg2接收消息,则dlg2的句柄作为SendMessage的第一个参数,第二个参数是所发送的消息(WM_USERMESSAGE),wParam和lParam为消息参数,如果不用可以随便加入以补齐参数。则本例发送消息的代码为:
::SendMessage(Dlg2.m_hWnd,WM_USERMESSAGE,(WPARAM)0,(LPARAM)0);
3、获取已存在对话框句柄
上例中,如果Dlg2没有实例,只有ID号及资源名称,可以使用FindWindow方法获得该对话框句柄。
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
参数:
IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
如果Dlg2的标题为“Dlg2”,则发送消息的代码可以改写为:
::SendMessage(FindWindow(NULL,"Dlg2")->m_hWnd,WM_USERMESSAGE,(WPARAM)0,(LPARAM)0);
首先弄清楚两点:
(1)谁要发送这个消息(2)谁要接受这个消息。
用一个简单的例子来说明。对象A向B(也可以就是A到A)发送消息。
1 发送消息
首先在A的头文件中定义这个消息:
#define WM_USERMESSAGE WM_USER+100
所有自定义消息都是以WM_USER消息为基础加上一个任意的自然数来表示的,为了防止冲突,选择稍大一点的自然数。A是向外发送消息的对象,因此在A的某个方法(函数)里就会调用用来发消息的函数B::SendMessage()/B::PostMessage(),因为是B接受消息,因此是如上的形式。
2 接受消息
对象接受一个消息,应该有三部分:在头文件中有该消息的处理函数的原型;在实现文件中有接受消息映射的宏;以及该消息的处理函数的具体实现。
2.1 头文件中加上自定义消息的处理函数原型
在DECLARE_MESSAGE_MAP()语句之前,一对AFX_MSG之间加上如下形式的函数原型:
afx_msg LRESULT OnProcName( WPARAM wParam, LPARAM lParam );
对Win32来说,wParam, lParam是传递消息最常用的手段。
2.2 在实现文件中加上接受消息映射的宏
在cpp文件里,BEGIN_MESSAGE_MAP语句之后,在一对AFX_MSG_MAP之间,增加 如下形式的代码:
ON_MESSAGE(WM_USERMESSAGE, OnProcName)
上面是不用分号结尾的。
2.3 在实现文件中给出消息处理函数的具体实现。
二、在两个对话框之间传递消息
两个对话框Dlg1,和Dlg2,Dlg1发送消息到Dlg2,使用::SendMessage方法。
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。
本例中,Dlg1发送消息,dlg2接收消息,则dlg2的句柄作为SendMessage的第一个参数,第二个参数是所发送的消息(WM_USERMESSAGE),wParam和lParam为消息参数,如果不用可以随便加入以补齐参数。则本例发送消息的代码为:
::SendMessage(Dlg2.m_hWnd,WM_USERMESSAGE,(WPARAM)0,(LPARAM)0);
3、获取已存在对话框句柄
上例中,如果Dlg2没有实例,只有ID号及资源名称,可以使用FindWindow方法获得该对话框句柄。
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
参数:
IpClassName :指向一个指定了类名的空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位,必须位于IpClassName的低 16位,高位必须为 0。
IpWindowName:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为空,则为所有窗口全匹配。
返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL。
如果Dlg2的标题为“Dlg2”,则发送消息的代码可以改写为:
::SendMessage(FindWindow(NULL,"Dlg2")->m_hWnd,WM_USERMESSAGE,(WPARAM)0,(LPARAM)0);
相关文章推荐
- vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage)
- 《企业集成模式.设计、构建及部署消息传递解决方案》学习笔记
- IssueVision 学习笔记(一)-----使用SoapHeader传递Web Serivices自定义的身份验证数据
- VC学习一日一练(2)---MFC中自定义消息
- 【iOS学习笔记 15-11-06】简单自定义navigationcontroller push和pop动画效果
- WIN32 API/WTL 学习笔记(消息传递过程)
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
- 《企业集成模式.设计、构建及部署消息传递解决方案》学习笔记
- 11.笔记 MySQL学习——设置和使用自定义变量
- Handler消息传递学习笔记
- StringTemplate.Net 学习笔记(11):自定义错误处理
- iOS学习笔记之远程推送、静默推送与自定义消息推送
- objc_msgSend消息传递学习笔记 – 消息转发
- vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage) (转载)
- 孙鑫VC++视频学习笔记之11:图形保存和重绘
- VC++ 自定义消息学习总结
- python学习笔记11(函数二): 参数的传递、变量的作用域
- 【ROS学习】(五)ROS消息传递——自定义消息
- vc++ 学习笔记11
- uc/os-iii学习笔记-消息传递