MFC的自定義消息的定義與使用


  自定義消息的響應和資源消息的響應有很多類似之處;資源消息的響應是以資源的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM