在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宏指令,其餘步驟同上。