VC/MFC子窗體向父窗體傳遞參數的幾種方法

VC/MFC子窗體向父窗體傳遞參數的幾種方法


典型問題舉例

    窗體和子窗體均有一個Edit控件和一個按鈕,點擊父窗體按鈕顯示子窗體;點擊子窗體按鈕後,子窗體中Edit控件的值顯示在在父窗體中的Edit控件中。 less

在MFC中實現子窗體向父窗體傳遞參數的幾種方法簡述

    一、在父窗體定義靜態變量
    二、傳窗體的指針給子窗體
    三、子窗體調用GetParent
    四、向父窗體sendMessage 函數

    方法1,使用靜態變量,若是有多個子對象和父對象存在時,處理比較麻煩。
    方法2, 傳指針給子窗體,子窗體須要另外保存這個指針,此方法可由方法3替代。
    方法3, 比方法2優,但與方法2都與父窗體耦合較深。
    方法4,推薦採用方法;採用這種方法,子窗體能夠放到任何父窗體上,只要父窗體響應此消息便可。 this

示例源碼

經過子窗體調用GetParent向父窗體傳遞參數的示例

GetParent()->SetDlgItemText(IDC_EDIT1,TCHAR *)

經過向父窗體發送消息(sendMessage)來傳遞參數示例

    SendMessage的基本結構以下 線程

SendMessage(
  HWND hWnd, //消息傳遞的目標窗口或線程的句柄。
  UINT Msg, //消息類別(這裏能夠是一些系統消息,也能夠是本身定義,下文具體介紹,)
  WPARAM wParam, //參數1 (WPARAM 實際上是與UINT是同種類型的,
                 //在vc編譯器中右鍵有個「轉到WPARAM的定義」的選項能夠查看。  
  LPARAM lParam); //參數2

    其中一些參數的說明以下: 指針

    //typedef unsigned int UINT;
    //typedef UINT WPARAM;
    //typedef LONG LPARAM;
    //typedef LONG LRESULT; code

    能夠用如下語句發送消息: 對象

::SendMessage(this->m_hWnd, WM_MY_DOSOME, (WPARAM) 0, (LPARAM) 0);

    這裏我發送的消息是本窗體接收的,因此句柄用:this->m_hWnd。 字符串

    這裏的消息類別WM_MY_DOSOME是用戶自定義的,在接收消息的窗體或線程所在的頭文件裏: 編譯器

#define WM_MY_DOSOME WM_USER+1 // do something
固然你還能夠定義更多如:
#define WM_DOOTHER WM_USER+2   // do other表示要作一些事情。

    咱們發了一個消息出去,那麼接收方要能識別這個消息是幹什麼,就是經過消息類別來區分,而且根據消息類別去調用消息處理函數。接收方須要作如下幾步: 源碼

一、在接收方編寫一個消息處理函數

    咱們在接收窗體裏定義一個消息處理函數,以處理接收到該消息後應該作什麼事情。

afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2)
{
    MessageBox("收到消息了,我要開始作一些事情了。","收到",MB_OK);
    //能夠運用iParam1,iParam2 來作一些事情。
    return 0;
}

    編寫消息處理函數有3點須要格外注意:

    1)使用了afx_msg,而且要將afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2) 改寫到頭文件的 {{AFX_MSG ... AFX_MSG}}包含的灰色部分,以下:

//{{AFX_MSG  
//。。。改寫到這裏,顏色會變成灰的。這一點很是重要。
//}}AFX_MSG

    2)參數有2個,WPARAM iParam1,LPARAM iParam2,哪怕沒有東西傳進來也要寫,否則會吃苦頭的,vc裏不會提醒你少寫了一個,但若是不寫可能會產生莫名奇妙的錯誤。

    3)類型用 LRESULT,完了要return 0; 

二、在接收方定義各類消息類型與消息處理函數的映射關係,即讓接收方知道每一個消息要調用哪一個處理函數

    映射關係書寫示例以下

//{{AFX_MSG_MAP
//。。。這裏寫上
ON_MESSAGE(WM_MY_DOSOME,DoSomeThing)
//若是還有其餘消息就再寫一個
ON_MESSAGE(WM_DOOTHER,DoOther)
//}}AFX_MSG_MAP

    到這裏,當發送方用SendMessage,發出一個WM_MY_DOSOME類型的消息過來的時候,接收方就會去作DoSomeThing(WPARAM iParam1,LPARAM iParam2);
發送方發出一個WM_DOOTHER類型的消息過來的時候,接收方就會去作DoOther(WPARAM iParam1,LPARAM iParam2)。

.h頭文件中要定義的內容

#define WM_MYMSG WM_USER+5 //自定義一個消息
afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自定義消息的處理函數聲明

.cpp文件要實現的內容

ON_MESSAGE(WM_MYMSG, OnMyMessage)
//利用ON_MESSAGE()宏在自定義消息與其處理函數間創建映射關係

void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
//從lParam中取出CString對象的指針,並將字符串內容在IDC_MSGEDIT中顯示出來
{
  CString *str;
  str=(CString *)lParam;

  SetDlgItemText(IDC_EDIT,*str);
}

按下按鈕發送消息

void CModelessDlg::OnMsgBTN()   {     CString str= "自定義消息被觸發了!";     SendMessage(WM_MYMSG, 0, (LPARAM) &str); //給ModelessDlg本身發一個自定義的消息 }
相關文章
相關標籤/搜索