创建自定义消息

首先,消息的数值是不能随便定义的,查阅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),否则消息将不会相应;

 

posted @ 2015-07-09 10:29  lanyuan114489  阅读(229)  评论(0编辑  收藏  举报