创建自定义消息
首先,消息的数值是不能随便定义的,查阅MSDN或相关文档可知,Windows对消息的区域已经做了规定;
#define WM_USER 0x0400
#define WM_APP 0x8000
(1)、0 ~ WM_USER-1:这个区间值的消息是操作系统定义应用的,我们是不能定义应用的;
(2)、WM_USER ~ WM_APP - 1:这段区域的消息是可有用户在自己的应用程序中定义和使用的,但不能应用于不同的应用程序,因为这些消息有可能在其他的类中已经定义,
例如一些控件等;
(3)、WM_APP ~ 0xBFFF:这段区域的消息可以应用在自己的程序中,不会与系统定义的消息冲突;
(4)、0xC000 ~ 0xFFFF:这段区域的消息主要应用在运行时用户调用RegisterWindowMessage函数注册消息用,这个消息是不同应用程序共享的,如同系统消息;
(5)、0xFFFF以上:系统保留;
下面以非模式对话框向父窗口发送自定义消息为例:
1、在父窗口的头文件中定义自己的消息:#define WM_MYMSG WM_USER + 2 ;
2、在自己的消息映射中:
BEGIN_MESSAGE_MAP(CDataTransDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDB_ADD_FORMAT, &CDataTransDlg::OnBnClickedAddFormat)
ON_MESSAGE(WM_CLOSE_ADD_DLG,OnCloseAddDlg)
END_MESSAGE_MAP()
3、在头文件中添加处理函数的声明:afx_msg LRESULT OnCloseAddDlg(WPARAM wPara,LPARAM lPara); 注意函数返回类型为:afx_msg LRESULT类型;
4、在cpp文件中添加对应函数:
LRESULT CDataTransDlg::OnCloseAddDlg(WPARAM wPara,LPARAM lParam)
{
m_AddFormatDlg.DestroyWindow();
return 0;
}
5、在非模态对话框关闭时发送消息给父窗口:
void CAddFormatDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
::SendMessage(GetParent()->m_hWnd,WM_CLOSE_ADD_DLG,0,0);
CDialogEx::OnClose();
}
说明:在应用RegisterWindowMessage函数注册消息时,消息映射会不同,需调用ON_REGISTERED_MESSAGE (WM_MYMESSAGE, OnCloseAddDlg),否则消息将不会相应;