簡單概要
本篇文章依然是關于 消息機制 的文章,在 上一章說到了使用線程來和視窗之間進行通信,今天就說一下兩個視窗之間進行通信的原理。
預備知識
你得知道什麼是 消息機制,或者你讀了我 上一章。
具體步驟
建立一個工程,名稱為“MultiWindows”,使用 Unicode 編碼。具體界面可以如下: 首先添加一個新的視窗并将界面布局為下圖,具體方法如下: 在添加好視窗之後還要為這個視窗添加一個 類檔案,具體方法可如下: 添加完成之後就可以添加消息功能了,這次有所不同的是,在以往的文章裡都是隻有一個視窗,而消息也都是在一個視窗内。如今變成了兩個視窗,為了使兩個視窗都知道 對方的消息ID是什麼,是以決定在 .h檔案中聲明消息ID(以前是在 *Dlg.h中聲明),具體添加方法如 之前的文章所說,隻是在聲明的時候 換一個位置。具體消息為 主視窗消息: 子視窗消息為: 添加完消息之後,可以到 工程名.h 中聲明消息ID了。 #define WM_MAIN_MSG WM_USER+0x01001
#define WM_SUB_MSG WM_USER+0x02001
之後再在 工程名Dlg.h 中聲明子視窗的視窗句柄變量 為 主視窗上的“ 打開子視窗(&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);
}
編譯運作
總結拓展
其實消息的用處是很廣的,不隻是在這裡可以展現!
事例下載下傳
下載下傳位址: 點選下載下傳