自定義消息的響應和資源消息的響應有很多類似之處;資源消息的響應是以資源的ID號作為標識的;自定義的消息要自己聲明消息ID。 一. 定義: 第一步要聲明消息: #define WM_MYMSG WM_USER+200 第二步要在類聲明中聲明消息映射: DECLARE_MESSAGE_MAP() 第三步
自定義消息的響應和資源消息的響應有很多類似之處;資源消息的響應是以資源的ID號作為標識的;自定義的消息要自己聲明消息ID。
一. 定義:
第一步要聲明消息:
#define WM_MYMSG WM_USER+200
第二步要在類聲明中聲明消息映射:
DECLARE_MESSAGE_MAP()
第三步要在類聲明中定義消息處理函數:
afx_msg LRESULT MyMsgHandler(WPARAM,LPARAM);
在.cpp中做的工作:
第四步要實現消息映射:
BEGIN_MESSAGE_MAP()
ON_MESSAGE(WM_MYMSG,OnMyMsgHandler)
END_MESSAGE_MAP()
第五步要實現消息處理函數(當然可以不實現):
LRESULT CMainFrame::OnMyMsgHandler(WPARAM w,LPARAM l)
{
AfxMessageBox("Hello,World!");
return 0;
}
二. 使用
1. 如果該自定義消息所在的類是有CWnd派生出來的,且在本類中調用,那麼我們可以調用CWnd::SendMessage()函數,具體定義為:
LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
此時我們只需要在引發消息的地方添加如下代碼:
SendMessge(WM_MYMSG,0,0);
如果我們想在不同的情況下發送用戶消息,我們只需要將SendMessage的後兩個參數wParam,lParam加以標識即可;在消息處理函數,寫一個if條件語句(或switch語句)就可以了;將不同情況下的用戶消息區分開;
例如看下麵的例子:
①加入消息響應函數實現在CCDlg類的實現文件中加入消息響應函數的實現部分,代碼如下: void CCDlg::Customize(WPARAM wParam, LPARAM lParam) { CString strTittle; strTittle.Format("自定義消息參數:x=%d,y=%d",wParam,lParam); SetWindowText(strTittle); } 此函數的作用是將滑鼠的位置信息顯示在對話框的標題欄部分。 ②.菜單部分
在主框架的“幫助”主菜單中加入“自定義消息”子菜單,其ID設為ID_CUSTOMIZE,通過類嚮導響應該命令,函數名預設。其函數體如下: void CMainFrame::OnCustomize() { // TODO: Add your command handler code here POINT pos; //將消息參數定義為屏幕坐標值 GetCursorPos(&pos); pdlg->SendMessage(WM_CUSTOMIZE,(UINT)pos.x,pos.y);//這裡就是將(UINT)pos.x,pos.y(註:它們分別對應①中消息響應函數的兩個參數WPARAM wParam和LPARAM lParam)兩個參數分別傳給消息響應函數。 }
2. 如果不在本類中響應自定義消息;那麼我們只能用win32 的API函數;例如,當自定義消息在CMainFrame中,而觸發消息的地方不在CMainFrame類中,那麼我們可以用如下語句:
::SendMessge(::AfxGetMainWnd()->m_hWnd,WM_MYMSG,0,0);
相關內容網址:
http://www.cnblogs.com/smartvessel/archive/2011/07/18/2109472.html
http://blog.csdn.net/penpenandtongtong/article/details/18598907
http://www.oschina.net/question/565065_72596
http://blog.chinaunix.net/uid-24459558-id-299010.html