簡單概要
本篇文章依然是關於 訊息機制 的文章,在上一章說到了使用線程來和視窗之間進行通訊,今天就說一下兩個視窗之間進行通訊的原理。
預備知識
你得知道什麼是 訊息機制,或者你讀了我上一章。
具體步驟
建立一個工程,名稱為“MultiWindows”,使用
Unicode 編碼。具體介面可以如下:首先添加一個新的視窗並將介面布局為,具體方法如下:在添加好視窗之後還要為這個視窗添加一個類檔案,具體方法可如下:添加完成之後就可以添加訊息功能了,這次有所不同的是,在以往的文章裡都是只有一個視窗,而訊息也都是在一個視窗內。如今變成了兩個視窗,為了使兩個視窗都知道對方的訊息ID是什麼,所以決定在.h檔案中聲明訊息ID(以前是在*Dlg.h中聲明),具體添加方法如之前的文章所說,只是在聲明的時候換一個位置。具體訊息為主視窗訊息:子視窗訊息為:添加完訊息之後,可以到 工程名.h 中聲明訊息ID了。
[cpp]
view plaincopyprint?
- #define WM_MAIN_MSG WM_USER+0x01001
- #define WM_SUB_MSG WM_USER+0x02001
#define WM_MAIN_MSG WM_USER+0x01001#define WM_SUB_MSG WM_USER+0x02001
之後再在 工程名Dlg.h 中聲明子視窗的視窗控制代碼變數為主視窗上的“開啟子視窗(&O)”和“向子視窗發送訊息(&S)”添加單擊代碼:
[cpp]
view plaincopyprint?
- // 開啟子視窗(&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);
- }
// 開啟子視窗(&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);}
然後給主視窗的訊息添加代碼:
[cpp]
view plaincopyprint?
- afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam)
- {
- CString* strMsg = (CString*)wParam;
- SetDlgItemText(IDC_EDIT1,*strMsg);
- return 0;
- }
afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam){CString* strMsg = (CString*)wParam;SetDlgItemText(IDC_EDIT1,*strMsg);return 0;}
以同樣的方法給子對話方塊的"向父視窗發送訊息(&S)"和訊息添加代碼[cpp]
view plaincopyprint?
- // 訊息代碼
- 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);
- }
// 訊息代碼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);}
編譯運行
總結拓展
其實訊息的用處是很廣的,不只是在這裡可以體現!
案例下載
:點擊下載
簡單概要
本篇文章依然是關於 訊息機制 的文章,在上一章說到了使用線程來和視窗之間進行通訊,今天就說一下兩個視窗之間進行通訊的原理。
預備知識
你得知道什麼是 訊息機制,或者你讀了我上一章。
具體步驟
建立一個工程,名稱為“MultiWindows”,使用
Unicode 編碼。具體介面可以如下:首先添加一個新的視窗並將介面布局為,具體方法如下:在添加好視窗之後還要為這個視窗添加一個類檔案,具體方法可如下:添加完成之後就可以添加訊息功能了,這次有所不同的是,在以往的文章裡都是只有一個視窗,而訊息也都是在一個視窗內。如今變成了兩個視窗,為了使兩個視窗都知道對方的訊息ID是什麼,所以決定在.h檔案中聲明訊息ID(以前是在*Dlg.h中聲明),具體添加方法如之前的文章所說,只是在聲明的時候換一個位置。具體訊息為主視窗訊息:子視窗訊息為:添加完訊息之後,可以到 工程名.h 中聲明訊息ID了。
[cpp]
view plaincopyprint?
- #define WM_MAIN_MSG WM_USER+0x01001
- #define WM_SUB_MSG WM_USER+0x02001
#define WM_MAIN_MSG WM_USER+0x01001#define WM_SUB_MSG WM_USER+0x02001
之後再在 工程名Dlg.h 中聲明子視窗的視窗控制代碼變數為主視窗上的“開啟子視窗(&O)”和“向子視窗發送訊息(&S)”添加單擊代碼:
[cpp]
view plaincopyprint?
- // 開啟子視窗(&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);
- }
// 開啟子視窗(&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);}
然後給主視窗的訊息添加代碼:
[cpp]
view plaincopyprint?
- afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam)
- {
- CString* strMsg = (CString*)wParam;
- SetDlgItemText(IDC_EDIT1,*strMsg);
- return 0;
- }
afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam){CString* strMsg = (CString*)wParam;SetDlgItemText(IDC_EDIT1,*strMsg);return 0;}
以同樣的方法給子對話方塊的"向父視窗發送訊息(&S)"和訊息添加代碼[cpp]
view plaincopyprint?
- // 訊息代碼
- 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);
- }
// 訊息代碼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);}
編譯運行
總結拓展
其實訊息的用處是很廣的,不只是在這裡可以體現!
案例下載
:點擊下載