1. 程式人生 > >vc++ 不同對話方塊中傳遞資訊的方法(基於自定義訊息SendMessage)

vc++ 不同對話方塊中傳遞資訊的方法(基於自定義訊息SendMessage)

也是花了一天時間才搞定的。

背景: 新建了一個基於對話方塊的MFC程式,在主對話方塊中新增tabcontrol控制元件,又新建了兩個Dialog(CDialog1和CDialog2),將它們設為tabcontrol控制元件的子對話方塊。

目的: 兩個子對話方塊之間傳遞訊息,子對話方塊與主對話方塊傳遞訊息。

方法: 第一步:  定義訊息.

             在目標視窗類的標頭檔案或者stdafx.h中新增: #define WM_MY_MESSAGE  (WM_USER+100)(巨集定義沒有分號)推薦使用者自定義訊息至少是WM_USER+100,因為很多新控制元件也要使用WM_USER訊息。

       第二步:   在目標類標頭檔案的AFX_MSG塊中說明訊息處理函式: afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

class CDialog1:public CDialog

... 
// 一般訊息對映函式 
protected: 
// {{AFX_MSG(CDialog) 
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 
//}}AFX_MSG 
DECLARE_MESSAGE_MAP() 

 第三步:在目標類原始檔cpp中,使用ON_MESSAGE巨集指令將訊息對映到訊息處理函式中。

BEGIN_MESSAGE_MAP(CDialog1, CDialog) 
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) 
//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 第四步:   實現訊息處理函式。

在目標類原始檔cpp中,該函式使用WPRAM和LPARAM引數並返回LPESULT。 

LPESULT CDialog1::OnMyMessage(WPARAM wParam, LPARAM lParam) 

// TODO: 處理使用者自定義訊息 
//MessageBox("訊息傳遞完成!");
return 0; 

              第五步:傳送訊息時,在源地址類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原始檔中的傳送函式應該這麼寫:

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

              要實現CDialog2向主對話方塊CSecondShimDlg傳送訊息(目標類即為CSecondShimDlg),則:

 CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd(); 
 m_Host->SendMessage(WM_MY_MESSAGE , wparam, lparam);
 
               或者:             

  ::SendMessage(this->GetParent()->GetParent()->m_hWnd, WM_MY_MESSAGE ,wparam, lparam);
      // SendMessage函式的第一個引數是目標視窗的控制代碼。之所以要用兩個GetParent()因為Dialog2的父對話方塊為TabControl,TabControl的父對話方塊為主對話方塊CSecondShimDlg 
這樣即可完成對話方塊之間的訊息傳遞。
 轉:https://blog.csdn.net/myj0513/article/details/6827360