c++ 對話框之間傳遞信息(自定義消息sendmessage)

建了一個基於對話框的MFC程序,在主對話框中添加tabcontrol控件,又新建了兩個Dialog(CDialog1和CDialog2),將它們設爲tabcontrol控件的子對話框。函數

目的:兩個子對話框之間傳遞消息,子對話框與主對話框傳遞消息。this

第一步: 定義消息.

             在目標窗口類的頭文件或者stdafx.h中添加: #define WM_MY_MESSAGE  (WM_USER+100);     推薦用戶自定義消息至少是WM_USER+100,由於不少新控件也要使用WM_USER消息。.net

       第二步:  在目標類頭文件的AFX_MSG塊中說明消息處理函數: afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);對象

[cpp] view plain copyblog

  1. class CDialog1:public CDialog  
  2. {   
  3. ...   
  4. // 通常消息映射函數   
  5. protected:   
  6. // {{AFX_MSG(CDialog)   
  7.  virtual BOOL OnInitDialog();  
  8.  afx_msg void OnSysCommand(UINT nID, LPARAM lParam);  
  9.  afx_msg void OnPaint();  
  10.  afx_msg HCURSOR OnQueryDragIcon();  
  11. afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);   
  12. //}}AFX_MSG   
  13. DECLARE_MESSAGE_MAP()   
  14. }   

   

         第三步:在目標類源文件cpp中,使用ON_MESSAGE宏指令將消息映射到消息處理函數中。get

 

[cpp] view plain copyit

  1. BEGIN_MESSAGE_MAP(CDialog1, CDialog)   
  2.  ON_WM_SYSCOMMAND()  
  3.  ON_WM_PAINT()  
  4.  ON_WM_QUERYDRAGICON()  
  5. ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)   
  6. //}}AFX_MSG_MAP   
  7. END_MESSAGE_MAP()   

             第四步:  實現消息處理函數。class

              在目標類源文件cpp中,該函數使用WPRAM和LPARAM參數並返回LPESULT。 程序

[cpp] view plain copyim

  1. LPESULT CDialog1::OnMyMessage(WPARAM wParam, LPARAM lParam)   
  2. {   
  3. // TODO: 處理用戶自定義消息   
  4. //MessageBox("消息傳遞完成!");  
  5. return 0;   
  6. }   


              第五步:發送消息時,在源地址類CDialog2的CPP文件中(如一個Button),調用函數PostMessage或SendMessa
ge發送消息。PoseMessage(WM_MY_MESSAGE,O,O); SendMessage(WM_MY_MESSAGE,O,O);

            

              假如主對話框的類名:CSecondShimDlg,兩個子對話框的類名CDialog1和CDialog2;

            . 要實現兩個子對話框之間進行通訊(CDialog2向CDialog1發送消息,目標類即爲CDialog1),則在CDialog2源文件中的發送函數應該這麼寫:

[cpp] view plain copy

  1. CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();   
  2. m_Host->m_Diag1.SendMessage(WM_MY_MESSAGE , wparam, lparam);//這裏要注意是m_Diag1,它是在主對話框類中定義的一個CDialog1對象,即目標對象。  


              要實現CDialog2向主對話框CSecondShimDlg發送消息(目標類即爲CSecondShimDlg),則:

[cpp] view plain copy

  1. CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();   
  2. m_Host->SendMessage(WM_MY_MESSAGE , wparam, lparam);  

               或者:             

[cpp] view plain copy

  1. ::SendMessage(this->GetParent()->GetParent()->m_hWnd, WM_MY_MESSAGE ,wparam, lparam);  
  2.     // SendMessage函數的第一個參數是目標窗口的句柄。之因此要用兩個GetParent()由於Dialog2的父對話框爲TabControl,TabControl的父對話框爲主對話框CSecondShimDlg   


 

這樣便可完成對話框之間的消息傳遞。

相關文章
相關標籤/搜索