MFC已集成了许多消息类型,如WM_LBUTTONDOWN/WM_LBUTTONUP等供我们使用,若无法满足,则需要我们自定义消息。由于MFC的类向导中不允许添加用户自定义消息,所以比喻在程序中添加相应的代码。
添加自定义消息
消息声明
MFC要求,WM_USER以下的是系统消息,WM_USER以上为自己定义消息。例如:
#define WM_MY_MESSAGE (WM_USER + 100)
添加消息映射
消息映射将消息与其对应的响应函数相互关联,消息映射的声明通常在窗口类中完成:
BEGIN_MESSAGE_MAP(CDMTEXEDlg, CDialogEx) // 窗口类的名称
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CANCEL, &CDMTEXEDlg::OnBnClickedCancel)
ON_WM_TIMER()
ON_WM_CTLCOLOR()
ON_MESSAGE(WM_MY_MESSAGE, &CDMTEXEDlg::OnDevicechange) // 自定义消息的映射:设备拔插
END_MESSAGE_MAP()
- ON_BN_CLICKED和ON_MESSAGE等为消息映射的类型
- ON_MESSAGE的两个参数中第一个为自定义的消息,第二个参数为响应消息的函数指针,该函数必须是CDMTEXEDlg窗口类的成员函数
消息处理
afx_msg LRESULT OnDevicechange(WPARAM wParam, LPARAM lParam);
定义系统唯一的消息让多个应用程序去处理
用户定义整个系统唯一的消息,需要调用SDK函数RegisterWindowMessage定义消息,即把上面的宏 #define WM_MyMessage (WM_USER+100) 使用如下代码代替
static UINT WM_MY_MESSAGE = RegisterWindowMessage("USER");
在消息映射中,使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
END_MESSAGE_MAP()
测试消息时,如果要让多个应用程序都接收到这个消息,使用:
::SendMessage(HWND_BROADCAST, WM_MyMessage, 0, 0);