首页 理论教育MFC视频教程:消息传递函数使用和示例

MFC视频教程:消息传递函数使用和示例

【摘要】:1)SendMessage和PostMessage函数都是消息传递函数,通过MSDN查看两个函数的格式。2个函数的4个参数的意义是一样的,只有返回值类型不同,LRESULT表示消息被处理后的返回值,BOOL表示消息是否传递成功。3)新建一个Win32工程,编写一段简单的代码测试消息传递函数。在MFC程序中,必须使用ON_MESSAGE来关联消息映射函数。PostMessage是非阻塞的,不等OnPostMessage执行完就继续向下执行,而且返回值是1,代表消息已经传送到。

窗口消息按照消息的来源可以分为系统定义的消息和应用程序自定义的消息。系统消息编号的范围是0~WM_USER-1,应用程序自定义消息是WM_USER~0x7FFF,WM_USER的数值是1024(0x400)。常用的一些消息,如WM_CLOSE(0x0010)、WM_MOUSEMOVE(0x0200)等都属于系统消息。

1)SendMessage和PostMessage函数都是消息传递函数,通过MSDN查看两个函数的格式。

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

2)SendMessage和PostMessage这两个函数消息的区别如下。

①返回值类型不同。2个函数的4个参数的意义是一样的,只有返回值类型不同(其实从数据上看它们同样都是一个32位的数,只是意义不一样),LRESULT表示消息被处理后的返回值,BOOL表示消息是否传递成功。

②PostMessage是异步的,SendMessage是同步的。PostMessage只把消息放入窗口消息队列中,不管消息被处理后的结果就返回;而SendMessage等待消息被处理完了之后才返回。

③如果在同一个线程内,则经常使用SendMessage发送消息时,速度快并能得到返回的消息处理结果。在不同线程或者进程之间,一般使用PostMessage发送消息,把消息先放入目标窗口的消息队列中,然后由目标窗口通过消息循环自行派发处理。

3)新建一个Win32工程,编写一段简单的代码测试消息传递函数。

978-7-111-46378-8-Chapter03-78.jpg

在不同进程之间,经常使用PostMessge发送命令或者传递数据。

4)MFC封装后的传递函数。

LRESULT SendMessage(UINT message,WPARAM wParam=0,LPARAM lParam=0);

BOOL PostMessage(UINT message,WPARAM wParam=0,LPARAM lParam=0);

在MFC工程中调用。

CWnd*p=FindWindow("NotePad",NULL);//查找一个记事本的窗口

if(p) //如果发现发送一个关闭窗口的消息

p->PostMessage(WM_CLOSE);

MFC在CWnd类中封装了以上两个函数,带有两个默认参数使用起来更加方便。在MFC工程中也可以使用上面的Win32函数,通过窗口句柄传递消息。在MFC中调用Win32函数时,函数名前经常要使用空定义域符号“::”,这是C++用于区别全局函数和成员函数的标志。

HWND hWnd=::FindWindow("NotePad",NULL); //查找一个记事本的窗口(www.chuimin.cn)

if(hWnd) //如果发现

::PostMessage(hWnd,WM_CLOSE,0,0); //发送一个关闭窗口的消息

5)接收自定义消息。

在Win32程序中只要在回调函数中使用分支语句,即可接收并处理自定义消息。在MFC程序中,必须使用ON_MESSAGE来关联消息映射函数。打开MSDN查看关于ON_MESSAGE的说明,很明显它是用于处理用户自定义消息的。接收自定义消息的函数,即ON_MESSAGE的消息映射函数,必须完全符合以下定义。

afx_msg LRESULT memberFxn(WPARAM,LPARAM);

6)新建立一个基于对话框的MFC工程“TestMsg”,来测试自定义消息的发送和接收。

参照与MSDN中ON_MESSAGE的例程,在BEGIN_MESSAGE_MAP下面编写代码。

978-7-111-46378-8-Chapter03-79.jpg

7)在头文件TestMsgDlg.h中“//{{AFX_MSG”下面,添加两个函数的声明。

978-7-111-46378-8-Chapter03-80.jpg

8)在窗口类源文件TestMsgDlg.cpp的最后,添加两个函数的函数体代码。

978-7-111-46378-8-Chapter03-81.jpg

9)在对话框初始化函数中编写代码,并设置断点,如图3-59所示。

在断点处按<F10>键单步执行,SendMessage和PostMessage测试的结果如下。

SendMessage是阻塞的,要等OnSendMessage函数执行完后才继续,同时SendMessage的返回值是OnSendMessage返回的2个数字相加的结果。

PostMessage是非阻塞的,不等OnPostMessage执行完就继续向下执行,而且返回值是1,代表消息已经传送到。

978-7-111-46378-8-Chapter03-82.jpg

图3-59 测试SendMessage和PostMessage函数