MFC學習筆記——多視窗之間的通訊 .

來源:互聯網
上載者:User
簡單概要

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

預備知識
你得知道什麼是 訊息機制,或者你讀了我上一章。
具體步驟
建立一個工程,名稱為“MultiWindows”,使用
Unicode 編碼。具體介面可以如下:首先添加一個新的視窗並將介面布局為,具體方法如下:在添加好視窗之後還要為這個視窗添加一個類檔案,具體方法可如下:添加完成之後就可以添加訊息功能了,這次有所不同的是,在以往的文章裡都是只有一個視窗,而訊息也都是在一個視窗內。如今變成了兩個視窗,為了使兩個視窗都知道對方的訊息ID是什麼,所以決定在.h檔案中聲明訊息ID(以前是在*Dlg.h中聲明),具體添加方法如之前的文章所說,只是在聲明的時候換一個位置。具體訊息為主視窗訊息:子視窗訊息為:添加完訊息之後,可以到 工程名.h 中聲明訊息ID了。  [cpp]
view plaincopyprint?
  1. #define WM_MAIN_MSG WM_USER+0x01001
      
  2. #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?
  1. // 開啟子視窗(&O)   
  2. void CMultiWindowsDlg::OnBnClickedButton1()  
  3. {  
  4.     if (dlg == NULL)   
  5.     {  
  6.         dlg = new CMySubDialog();  
  7.         dlg->Create(IDD_DIALOG1,this);  
  8.     }  
  9.   
  10.     if (dlg == NULL) return (void)MessageBox(_T("子視窗的控制代碼為空白!"));  
  11.     dlg->ShowWindow(SW_SHOWNORMAL);  
  12. }  
  13.   
  14. // 向子視窗發送訊息(&S)   
  15. void CMultiWindowsDlg::OnBnClickedButton2()  
  16. {  
  17.     CString strEdit;  
  18.     GetDlgItemText(IDC_EDIT1,strEdit);  
  19.   
  20.     if (dlg == NULL) return (void)MessageBox(_T("子視窗的控制代碼為空白!"));  
  21.     dlg->SendMessage(WM_SUB_MSG,(WPARAM)&strEdit);  
  22. }  
// 開啟子視窗(&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?
  1. afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     CString* strMsg = (CString*)wParam;  
  4.     SetDlgItemText(IDC_EDIT1,*strMsg);  
  5.     return 0;  
  6. }  
afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam){CString* strMsg = (CString*)wParam;SetDlgItemText(IDC_EDIT1,*strMsg);return 0;}

以同樣的方法給子對話方塊的"向父視窗發送訊息(&S)"和訊息添加代碼[cpp]
view plaincopyprint?

  1. // 訊息代碼   
  2. afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam)  
  3. {  
  4.     // 將 wParam 強制轉換為 CString 類型   
  5.     CString* strMsg = (CString*)wParam;  
  6.   
  7.     // 設定對話方塊中編輯框的文本   
  8.     SetDlgItemText(IDC_EDIT1,*strMsg);  
  9.   
  10.     return 0;  
  11. }  
  12.   
  13. // 向父視窗發送訊息(&S)   
  14. void CMySubDialog::OnBnClickedButton1()  
  15. {  
  16.     // 獲得編輯框中的文本   
  17.     CString strEdit;  
  18.     GetDlgItemText(IDC_EDIT1,strEdit);  
  19.   
  20.     // 獲得父視窗的控制代碼   
  21.     HWND hWnd = this->GetParent()->GetSafeHwnd();  
  22.   
  23.     // 向父視窗發送訊息   
  24.     if (hWnd == NULL) return (void)MessageBox(_T("獲得父視窗控制代碼失敗!"));  
  25.     ::SendNotifyMessage(hWnd,WM_MAIN_MSG,(WPARAM)&strEdit,NULL);  
  26. }  
// 訊息代碼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?
  1. #define WM_MAIN_MSG WM_USER+0x01001
      
  2. #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?
  1. // 開啟子視窗(&O)   
  2. void CMultiWindowsDlg::OnBnClickedButton1()  
  3. {  
  4.     if (dlg == NULL)   
  5.     {  
  6.         dlg = new CMySubDialog();  
  7.         dlg->Create(IDD_DIALOG1,this);  
  8.     }  
  9.   
  10.     if (dlg == NULL) return (void)MessageBox(_T("子視窗的控制代碼為空白!"));  
  11.     dlg->ShowWindow(SW_SHOWNORMAL);  
  12. }  
  13.   
  14. // 向子視窗發送訊息(&S)   
  15. void CMultiWindowsDlg::OnBnClickedButton2()  
  16. {  
  17.     CString strEdit;  
  18.     GetDlgItemText(IDC_EDIT1,strEdit);  
  19.   
  20.     if (dlg == NULL) return (void)MessageBox(_T("子視窗的控制代碼為空白!"));  
  21.     dlg->SendMessage(WM_SUB_MSG,(WPARAM)&strEdit);  
  22. }  
// 開啟子視窗(&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?
  1. afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     CString* strMsg = (CString*)wParam;  
  4.     SetDlgItemText(IDC_EDIT1,*strMsg);  
  5.     return 0;  
  6. }  
afx_msg LRESULT CMultiWindowsDlg::OnMainMsg(WPARAM wParam, LPARAM lParam){CString* strMsg = (CString*)wParam;SetDlgItemText(IDC_EDIT1,*strMsg);return 0;}

以同樣的方法給子對話方塊的"向父視窗發送訊息(&S)"和訊息添加代碼[cpp]
view plaincopyprint?

  1. // 訊息代碼   
  2. afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam)  
  3. {  
  4.     // 將 wParam 強制轉換為 CString 類型   
  5.     CString* strMsg = (CString*)wParam;  
  6.   
  7.     // 設定對話方塊中編輯框的文本   
  8.     SetDlgItemText(IDC_EDIT1,*strMsg);  
  9.   
  10.     return 0;  
  11. }  
  12.   
  13. // 向父視窗發送訊息(&S)   
  14. void CMySubDialog::OnBnClickedButton1()  
  15. {  
  16.     // 獲得編輯框中的文本   
  17.     CString strEdit;  
  18.     GetDlgItemText(IDC_EDIT1,strEdit);  
  19.   
  20.     // 獲得父視窗的控制代碼   
  21.     HWND hWnd = this->GetParent()->GetSafeHwnd();  
  22.   
  23.     // 向父視窗發送訊息   
  24.     if (hWnd == NULL) return (void)MessageBox(_T("獲得父視窗控制代碼失敗!"));  
  25.     ::SendNotifyMessage(hWnd,WM_MAIN_MSG,(WPARAM)&strEdit,NULL);  
  26. }  
// 訊息代碼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);}
編譯運行
總結拓展
其實訊息的用處是很廣的,不只是在這裡可以體現!
案例下載
:點擊下載
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.