WINDOWS自定义消息:WM_USER和WM_APP
WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用(WM_USER + 一个整数值),但总值不能超过0x7FFF。
#defineWM_USER 0x0400 -->1024
WM_APP常量是Windows帮助应用程序定义私有消息,通常使用(WM_APP+一个整数值),但总值不能超过0xBFFF。
#defineWM_APP 0x8000 -->32768
这两个都定义在WinUser.h中。
范围 表示
0~WM_USER–1 操作系统保留的消息。
WM_USER ~ 0x7FFF 私有窗口类用的整数型消息。
WM_APP ~0xBFFF 应用程序用的消息。
0xC000~0xFFFF 应用程序用的字符串消息。
0xFFFF~ 操作系统保留的消息。
http://jingyan.baidu.com/article/d5c4b52bc79d00da560dc59b.html
MFC自定义消息:
1. 在头文件stdafx.h中增加一个自定义消息宏
#define WM_USER_THREADEND WM_USER + 1
2. 在于增加新消息的窗口或对话框类的头文件中增加一个回调函数声明,注意要声明为public
afx_msg LRESULT OnUserThreadend(WPARAM wParam, LPARAM lParam);
3.在窗口/对话框cpp文件的BEGIN_MESSAGE_MAP,END_MESSAGE_MAP中增加:
BEGIN_MESSAGE_MAP(CTestDlg,CDialog)
...
ON_MESSAGE(WM_USER_THREADEND,OnUserThreadend)
END_MESSAGE_MAP()
4. 在窗口或对话框的cpp文件中增加回调函数的实现,如:
LRESULT ThreadDialog::OnUserThreadend(WPARAM wParam, LPARAMlParam)
{
TRACE("WM_USER_THREADENDmessage /n"); return 0;
}
5. 自定义消息的触发
::PostMessage(GetSafeHwnd(),WM_USER_THREADEND, 0, 0);
其中GetSafeHwnd()得到了一个当前窗口的句柄,此消息将发给当前窗口,如果想发送消息给其它窗口只需改变这个句柄,前提是目的窗口也实现了此消息的处理函数。
队列消息和非队列消息:
Windows把消息分为两种:一种是需要立即处理的消息,另一种是不需要立即处理的消息。
对于需要立即处理的消息,Windows直接把它送给窗口的消息处理函数进行处理,这类消息我们叫做非队列消息;而对于不需要立即处理的消息,Windows会把它发送给应用程序的消息队列进行排队,由应用程序逐个进行处理,我们把这类消息叫做队列消息。
PostMessage是寄送消息,函数执行后立即返回。寄送的消息是队列消息,放在程序的消息队列中排队处理。一般来说,新寄送的消息排在消息队列的末尾,这样可以保证窗口以先进先出的顺序处理消息。
SendMessage是发送消息,它发出的消息是非队列消息,直接调用窗口过程函数处理。SendMessage函数一直等消息处理完成后才返回。
Windows消息编程 http://www.cnblogs.com/findumars/p/5810941.html