在VC項目開發中,很多時候需要自己定義訊息進行交易處理。上次也剛好有同學問及,這裡綜合網路上的一些資料,集中起來供參考。u 自訂訊息我們可以通過一下兩種方法來自訂一個訊息:1) 方法一
Step 1:使用WM_TASKBARCREATED來確定一個沒有被windows本身搶佔的訊息值,在想添加訊息檔案中添加代碼:
| const UINT WM_USERDEFMSG = ::RegisterWindowMessage(_T("UserDefMsg")); |
Step 2:定義訊息的處理過程:在處理訊息的類(如Dlg類或者MainFrame等)添加訊息處理函式宣告:
| afx_msg LRESULT OnUserDefMsg(WPARAM wParam,LPARAM lParam); |
在實現檔案中添加訊息處理實現,這裡給出一個實現例子:
| LRESULT ××××::OnUserDefMsg(WPARAM wParam,LPARAM lParam)//××××代表處理該訊息的類名 { MessageBox("響應了自訂的訊息,^_^","自訂訊息響應",MB_ICONQUESTION | MB_OK); return 0;} |
Step 3:添加訊息處理宏,在處理該訊息的類的訊息宏中添加自訂訊息的宏,即在BEGIN_MESSAGE_MAP代碼塊中添加代碼:
| ON_REGISTERED_MESSAGE(WM_USERDEFMSG, OnUserDefMsg) |
自訂訊息完畢。2) 方法二
Step 1:定義訊息值,這裡不通過RegisterWindowMessage擷取,而是自訂方式實現,在想添加訊息檔案中添加代碼:
| #define WM_USERDEFMSG (WM_USER + 101) |
Microsoft推薦自訂訊息值至少為WM_USER + 100。
Step 2:同方法一中實現;
Step 3:同方法一中,但是宏名稱改為ON_MESSAGE。u 發送訊息按照上面方式我們已經自訂了訊息,並為該訊息實現了簡單的處理過程,這裡就通過發送訊息獲得自訂訊息的響應。在要觸發自訂訊息地方添加代碼:
| ::SendMessage(GetSafeHwnd(),WM_USERDEFMSG,0L,0L); |
這樣你就觸發了該自訂訊息,並將得到提示對話方塊顯示。下面是第二種增加自訂訊息方法的步驟:
第一步:定義訊息。開發Windows95應用程式時,Microsoft推薦使用者自訂訊息至少是WM_USER+100,因為很多新控制項也要使用WM_USER訊息。
第二步:實現訊息處理函數。該函數使用WPRAM和LPARAM參數並返回LPESULT。
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 處理使用者自訂訊息
...
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_MAP
END_MESSAGE_MAP()
如果使用者需要一個整個系統唯一的訊息,可以調用SDK函數RegisterWindowMessage並使用ON_REGISTER_MESSAGE巨集指令取代ON_MESSAGE巨集指令,其餘步驟同上。