窗體和子窗體均有一個Edit控件和一個按鈕,點擊父窗體按鈕顯示子窗體;點擊子窗體按鈕後,子窗體中Edit控件的值顯示在在父窗體中的Edit控件中。 less
一、在父窗體定義靜態變量
二、傳窗體的指針給子窗體
三、子窗體調用GetParent
四、向父窗體sendMessage 函數
方法1,使用靜態變量,若是有多個子對象和父對象存在時,處理比較麻煩。
方法2, 傳指針給子窗體,子窗體須要另外保存這個指針,此方法可由方法3替代。
方法3, 比方法2優,但與方法2都與父窗體耦合較深。
方法4,推薦採用方法;採用這種方法,子窗體能夠放到任何父窗體上,只要父窗體響應此消息便可。 this
SendMessage的基本結構以下 線程
其中一些參數的說明以下: 指針
//typedef unsigned int UINT;
//typedef UINT WPARAM;
//typedef LONG LPARAM;
//typedef LONG LRESULT; code
能夠用如下語句發送消息: 對象
這裏我發送的消息是本窗體接收的,因此句柄用:this->m_hWnd。 字符串
這裏的消息類別WM_MY_DOSOME是用戶自定義的,在接收消息的窗體或線程所在的頭文件裏: 編譯器
咱們發了一個消息出去,那麼接收方要能識別這個消息是幹什麼,就是經過消息類別來區分,而且根據消息類別去調用消息處理函數。接收方須要作如下幾步: 源碼
一、在接收方編寫一個消息處理函數
咱們在接收窗體裏定義一個消息處理函數,以處理接收到該消息後應該作什麼事情。
編寫消息處理函數有3點須要格外注意:
1)使用了afx_msg,而且要將afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2) 改寫到頭文件的 {{AFX_MSG ... AFX_MSG}}包含的灰色部分,以下:
2)參數有2個,WPARAM iParam1,LPARAM iParam2,哪怕沒有東西傳進來也要寫,否則會吃苦頭的,vc裏不會提醒你少寫了一個,但若是不寫可能會產生莫名奇妙的錯誤。
3)類型用 LRESULT,完了要return 0;
二、在接收方定義各類消息類型與消息處理函數的映射關係,即讓接收方知道每一個消息要調用哪一個處理函數
映射關係書寫示例以下
到這裏,當發送方用SendMessage,發出一個WM_MY_DOSOME類型的消息過來的時候,接收方就會去作DoSomeThing(WPARAM iParam1,LPARAM iParam2);
發送方發出一個WM_DOOTHER類型的消息過來的時候,接收方就會去作DoOther(WPARAM iParam1,LPARAM iParam2)。
.h頭文件中要定義的內容
.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);
}
按下按鈕發送消息