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