Windows 應用程式所要做的每項工作幾乎都是基于消息處理的, Windows 系統消息分為常用 Windows 消息,控件通知消息和指令。然而,有時我們需要定義自己的消息來通知程式什麼事情發生了,這就是使用者自定義消息。 ClassWizard 并沒有提供增加使用者自定義消息的功能,是以要使用使用者自定義消息,必須手工編寫代碼。然後 ClassWizard 才可以象處理其它消息一樣處理你自定義的消息。具體做法如下詳解:
第一步:定義消息。一個消息實際上是開發 Windows95 應用程式時, Microsoft 推薦使用者自定義消息至少是 WM_USER+100 ,因為很多新控件也要使用 WM_USER 消息。
第二步:實作消息處理函數。該函數使用 WPRAM 和 LPARAM 參數并傳回 LPESULT 。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam){// TODO: 處理使用者自定義消息 AfxMessageBox(" 處理使用者自定義消息 "); return 0;}
第三步:在類頭檔案的 AFX_MSG 塊中說明消息處理函數:
class CMainFrame:public CMDIFrameWnd{
...
// 一般消息映射函數
protected:
// {{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTimer(UINT nIDEvent);
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()}
第四步:在使用者類的消息塊中,使用 ON_MESSAGE 宏指令将消息映射到消息處理函數中。
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
//}}AFX_MSG_MAPEND_MESSAGE_MAP()
這樣,一個使用者自定義消息就可以使用了,如果使用者需要一個整個系統唯一的消息,可以調用 SDK 函數 RegisterWindowMessage 并使用 ON_REGISTER_MESSAGE 宏指令取代 ON_MESSAGE 宏指令,其餘步驟同上。
現在.cpp檔案的頂端
#define WM_MYMESSAGE WM_USER+100
在到.h檔案的
//{{AFX_MSG(CMyDlg) //自動生成的
afx_msg void OnMyMessage(); //你要填寫的
//}}AFX_MSG //自動生成的。
在到.cpp檔案中
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) //自動生成的
//{{AFX_MSG_MAP(CMyDlg)//自動生成的
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage) //你要填寫的
//}}AFX_MSG_MAP//自動生成的
END_MESSAGE_MAP() //自動生成的
然後定義函數
void CMyDlg::OnMyMessage()
{
AfxMessageBox("this is my message") ;
}
最後就是發消息了,如果不用API
就SendMessage(WM_MYMESSAGE, 0, 0 );
如果用API
就SendMessage(視窗句柄,WM_MYMESSAGE, 0 , 0)