天天看點

[每日一學]MFC學習筆記——多視窗之間的通信

簡單概要

本篇文章依然是關于 消息機制 的文章,在 上一章說到了使用線程來和視窗之間進行通信,今天就說一下兩個視窗之間進行通信的原理。

預備知識

你得知道什麼是 消息機制,或者你讀了我 上一章。

具體步驟

建立一個工程,名稱為“MultiWindows”,使用 Unicode 編碼。具體界面可以如下:
[每日一學]MFC學習筆記——多視窗之間的通信
首先添加一個新的視窗并将界面布局為下圖,具體方法如下:
[每日一學]MFC學習筆記——多視窗之間的通信
[每日一學]MFC學習筆記——多視窗之間的通信
在添加好視窗之後還要為這個視窗添加一個 類檔案,具體方法可如下:
[每日一學]MFC學習筆記——多視窗之間的通信
[每日一學]MFC學習筆記——多視窗之間的通信
添加完成之後就可以添加消息功能了,這次有所不同的是,在以往的文章裡都是隻有一個視窗,而消息也都是在一個視窗内。如今變成了兩個視窗,為了使兩個視窗都知道 對方的消息ID是什麼,是以決定在 .h檔案中聲明消息ID(以前是在 *Dlg.h中聲明),具體添加方法如 之前的文章所說,隻是在聲明的時候 換一個位置。具體消息為 主視窗消息:
[每日一學]MFC學習筆記——多視窗之間的通信
子視窗消息為:
[每日一學]MFC學習筆記——多視窗之間的通信
添加完消息之後,可以到 工程名.h 中聲明消息ID了。 
[每日一學]MFC學習筆記——多視窗之間的通信
#define WM_MAIN_MSG WM_USER+0x01001
#define WM_SUB_MSG WM_USER+0x02001
           
之後再在 工程名Dlg.h 中聲明子視窗的視窗句柄變量
[每日一學]MFC學習筆記——多視窗之間的通信
為 主視窗上的“ 打開子視窗(&O)”和“ 向子視窗發送消息(&S)”添加單擊代碼:
// 打開子視窗(&O)
void CMultiWindowsDlg::OnBnClickedButton1()
{
	if (dlg == NULL) 
	{
		dlg = new CMySubDialog();
		dlg->Create(IDD_DIALOG1,this);
	}

	if (dlg == NULL) return (void)MessageBox(_T("子視窗的句柄為空!"));
	dlg->ShowWindow(SW_SHOWNORMAL);
}

// 向子視窗發送消息(&S)
void CMultiWindowsDlg::OnBnClickedButton2()
{
	CString strEdit;
	GetDlgItemText(IDC_EDIT1,strEdit);

	if (dlg == NULL) return (void)MessageBox(_T("子視窗的句柄為空!"));
	dlg->SendMessage(WM_SUB_MSG,(WPARAM)&strEdit);
}
           
然後給主視窗的 消息添加代碼:
afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam)
{
	CString* strMsg = (CString*)wParam;
	SetDlgItemText(IDC_EDIT1,*strMsg);
	return 0;
}
           
以同樣的方法給子對話框的" 向父視窗發送消息(&S)"和 消息添加代碼
// 消息代碼
afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam)
{
	// 将 wParam 強制轉換為 CString 類型
	CString* strMsg = (CString*)wParam;

	// 設定對話框中編輯框的文本
	SetDlgItemText(IDC_EDIT1,*strMsg);

	return 0;
}

// 向父視窗發送消息(&S)
void CMySubDialog::OnBnClickedButton1()
{
	// 獲得編輯框中的文本
	CString strEdit;
	GetDlgItemText(IDC_EDIT1,strEdit);

	// 獲得父視窗的句柄
	HWND hWnd = this->GetParent()->GetSafeHwnd();

	// 向父視窗發送消息
	if (hWnd == NULL) return (void)MessageBox(_T("獲得父視窗句柄失敗!"));
	::SendNotifyMessage(hWnd,WM_MAIN_MSG,(WPARAM)&strEdit,NULL);
}
           

編譯運作

[每日一學]MFC學習筆記——多視窗之間的通信

總結拓展

其實消息的用處是很廣的,不隻是在這裡可以展現!

事例下載下傳

下載下傳位址: 點選下載下傳