【转载+修改】MFC 自定义消息四步曲与在参数中传递变量
2012-07-07 16:08
288 查看
今天自己也重学了一下 VC小自定义消息的使用,在网上查阅了相关资料,发现http://hi.baidu.com/atlight/blog/item/11ba969442df6218d21b70cd.html这篇博文介绍的最好(在此谢过原文作者),所以就转过了,但自己增加了一些进一步的详细说明,我也是刚自学,不一定全正确,所以欢迎大家指正。
1. 定义全局变量或宏
#define WM_MyMessage (WM_USER + n)
n为数字到少大于100
或者用 const UINT WM_MYMESSAGE = WM_USER + n
一般可以加在stdafx.h 或resource.h 或*.app.h中。
只要是在全局变量头文件所以都可以.
2. 在所在类的*.H文件增加消息函数声明. 这一步跟定义普通函数一样,首先需要(在*.h)文件中对函数进行声明。
protected:
//{{AFX_MSG(CChildView)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
3.在所在类的实现文件*.CPP文件中增加消息映射(告诉程序当接受到WM_MyMessage消息时交付给哪一个函数响应消息) 和实现消息处理函数
BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)
ON_MESSAGE(WM_MyMessage, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//实现消息处理函数. 这一步类似于普通函数的具体实现
也就是说WM_MyMessage消息对应OnMyMessage函数
LRESULT 类名::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
return 0;
}
4. 以后就可以随时使用SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 或 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 发送自定义的消息。
说明:
1:PostMessage()与SendMessage()函数的区别是:SendMessage()的消息直接发给窗口并调用相应的消息响应函数,消息不进消息队列,但直到消息响应函数处理完后SendMessage()才返回。而PostMessage()将消息放入消息队列后立即返回。
2:其中WPARAM wParam,LPARAM lParam二者为指针,所以发送自定义消息时如果想传相关参数,可以将参数的地址赋给这2个参数之一即可。如在发送自定义的消息的部分程序如下:
注意:由于说明1的区别,在传递参数时一定要注意如果是传递局部变量一定是用SendMessage()函数,如果是传递全局变量(而且在消息函数响应之前该全局变量不会被注销)则两种消息传递函数均可使用。 例如,在A()函数中调用PostMessage()函数发送消息时还传递了参数B,则由于PostMessage()函数发消息发送至消息队列之后立即放回,从而执行PostMessage()函数之后的语句,直至A()函数结束返回,这时A()函数中的所有局部变量(如B)全部被释放,所以当消息响应函数捕获到消息时,得到关于参数B的指针已经是一个野指针了;但是如果是用SendMessage()发送消息并传递参数B,由于A()中SendMessage()函数之后的语句要等消息响应函数处理完后才执行,所以在消息响应函数中的得到的B指针仍然有效。
1. 定义全局变量或宏
#define WM_MyMessage (WM_USER + n)
n为数字到少大于100
或者用 const UINT WM_MYMESSAGE = WM_USER + n
一般可以加在stdafx.h 或resource.h 或*.app.h中。
只要是在全局变量头文件所以都可以.
2. 在所在类的*.H文件增加消息函数声明. 这一步跟定义普通函数一样,首先需要(在*.h)文件中对函数进行声明。
protected:
//{{AFX_MSG(CChildView)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
3.在所在类的实现文件*.CPP文件中增加消息映射(告诉程序当接受到WM_MyMessage消息时交付给哪一个函数响应消息) 和实现消息处理函数
BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)
ON_MESSAGE(WM_MyMessage, OnMyMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//实现消息处理函数. 这一步类似于普通函数的具体实现
也就是说WM_MyMessage消息对应OnMyMessage函数
LRESULT 类名::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
return 0;
}
4. 以后就可以随时使用SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 或 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 发送自定义的消息。
说明:
1:PostMessage()与SendMessage()函数的区别是:SendMessage()的消息直接发给窗口并调用相应的消息响应函数,消息不进消息队列,但直到消息响应函数处理完后SendMessage()才返回。而PostMessage()将消息放入消息队列后立即返回。
2:其中WPARAM wParam,LPARAM lParam二者为指针,所以发送自定义消息时如果想传相关参数,可以将参数的地址赋给这2个参数之一即可。如在发送自定义的消息的部分程序如下:
#define MAX_LEN 50 char para[MAX_LEN]; strcpy(para, "this is a string parameter"); int val = 100; this->PostMessage(WM_MY_MESSAGE, (WPARAM)para, (LPARAM)(&val));那么消息响应函数OnMyMessage()函数中的部分代码为:
#define MAX_STRING_LEN 100 char pstr[MAX_STRING_LEN+1]; strncpy(pstr, (char *)wParam, MAX_STRING_LEN); pstr[MAX_STRING_LEN]='\0'; int val = *((int*)lParam); CString msg; msg.Format("wParam = %s, val=%d\n", pstr,val); this->MessageBox(msg);
注意:由于说明1的区别,在传递参数时一定要注意如果是传递局部变量一定是用SendMessage()函数,如果是传递全局变量(而且在消息函数响应之前该全局变量不会被注销)则两种消息传递函数均可使用。 例如,在A()函数中调用PostMessage()函数发送消息时还传递了参数B,则由于PostMessage()函数发消息发送至消息队列之后立即放回,从而执行PostMessage()函数之后的语句,直至A()函数结束返回,这时A()函数中的所有局部变量(如B)全部被释放,所以当消息响应函数捕获到消息时,得到关于参数B的指针已经是一个野指针了;但是如果是用SendMessage()发送消息并传递参数B,由于A()中SendMessage()函数之后的语句要等消息响应函数处理完后才执行,所以在消息响应函数中的得到的B指针仍然有效。
相关文章推荐
- MFC 自定义消息四步曲与在参数中传递变量
- MFC 自定义消息四步曲与在参数中传递变量
- mfc自定义消息 wparam lparam 参数传递指针
- 用户自定义消息,以及消息传递的参数设定
- MFC 自定义消息(类向对话框类传递自定义消息)
- 基于VS2010的MFC多线程编程(指针、句柄、整形变量等参数传递 )
- MFC中,自定义消息函数必须把所有参数都带上。
- 在MFC中添加用户自定义消息【转载】
- MFC 自定义消息四步曲
- [转载]利用MFC消息映射机制自定义消息
- vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage) (转载)
- ·剖析MFC六大关键技术(五六)--消息映射与命令传递 (转载,版权归原作者)
- mfc通过消息传递参数进行程序间通信
- VC中自定义消息实现(转载于并加以修改)
- MFC对话框之间自定义消息传递
- 在MFC中添加用户自定义消息【转载】
- MFC 自定义消息四步曲
- 如何在MFC对话框之间自定义消息传递
- ·剖析MFC六大关键技术(五六)--消息映射与命令传递 (转载,版权归原作者)
- MFC 自定义消息四步曲