自定義消息

2010-10-11 20:41

VC自定義消息

方法一:
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)

自定義消息完畢。

方法二:
Step 1:定義消息值,這裏不通過RegisterWindowMessage獲取,而是自定義方式實現,
在想添加消息文件中添加代碼:
#define WM_MY_MESSAGE (WM_USER + 101)

Microsoft推薦自定義消息值至少爲WM_USER + 100。
Step 2:實現消息處理函數。該函數使用WPRAM和LPARAM參數並返回LPESULT。

LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 處理用戶自定義消息
...
return 0;
}

Step 3:在類頭文件的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()
}
Step 4:在用戶類的消息塊中,使用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宏指令,其餘步驟同上。

Step 5:按照上面方式我們已經自定義了消息,併爲該消息實現了簡單的處理過程,

這裏就通過發送消息獲得自定義消息的響應。在要觸發自定義消息地方添加代碼:
::SendMessage(GetSafeHwnd(),WM_MY_MESSAGE,0L,0L);

發佈了17 篇原創文章 · 獲贊 8 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章