文章目錄
- 前言
- 一、父子對話框之間的數據傳遞
- 1.父窗口獲取子窗口數據
- 2.子窗口獲取父窗口數據
- 二、類外函數調用窗口的操作
- 1.全局變量方式
- 2.參數傳遞方式
- 總結
前言
Windows程序設計29:對話框之間的數據傳遞。
在Windows程序設計28:MFC模態與非模態對話框中通過點擊主對話框上的按鈕創建了子對話框。那么在對話框創建出來之后,就涉及到了父子對話框或者兄弟對話框之間數據的傳遞。
一、父子對話框之間的數據傳遞
1.父窗口獲取子窗口數據
由于是父窗口創建的子窗口,因此父窗口獲取子窗口的數據(窗口句柄或者窗口指針等)較為簡單。
根據上述鏈接中的代碼,在主對話框(父窗口)中點擊按鈕創建子窗口(模態和非模態對話框),那么子窗口的窗口對象在主對話框中很方便就可以獲取到,如下圖紅框部分
可以直接對非模態對話框修改其編輯框內的內容,表示可以在父窗口中利用子窗口的窗口句柄
得到如下結果
但是無法在模態對話框中進行修改編輯框的內容。這是因為即便父窗口仍然能夠得到模態對話框的實例句柄,但是DoModal不像Create那樣直接創建了窗口,確保了控件的有效性。即調用DoModal之前還不存在模態對話框實例(如果不存在窗口實例而調用其內部方法會出現斷言失敗),而在調用DoModal之后程序還會阻塞,因此無法進行修改。
會發生斷言失敗
2.子窗口獲取父窗口數據
但是反過來,子窗口獲取父窗口的數據有些復雜。因為子窗口中默認是沒用父窗口的窗口句柄的。
為了演示方便,在父窗口(主對話框)上也加一個編輯框控件
想要實現的功能為當關閉子窗口時,將子窗口中編輯框內的內容放到父窗口的編輯框上。
有多種方法獲取父窗口數據,第一種為利用GetParent函數直接獲取父窗口指針
獲取成功
此外,還可以通過利用extern設置全局變量(將父窗口的指針設置為全局變量)來在子窗口中訪問父窗口的指針。
聲明全局變量:
初始化全局變量
直接可以在子窗口的源文件中使用
同樣成功
此外,還有第三種方法:App類獲取法。在主線程的源文件中,將主對話框類的實例賦值給了主線程類的m_pMainWnd對象,即該線程的主窗口。因此我們只要把這個變量拿過來使用即可,利用函數AfxGetApp()獲取當前的主線程指針。
取得主線程指針
運行成功
二、類外函數調用窗口的操作
為了演示方便,在主對話框上再添加一個按鈕3控件,并設置其點擊消息響應函數
想要在類外函數GetEdit內調用一些主對話框類上編輯框等一些控件的操作,主要有兩種方法
1.全局變量方式
將需要使用的變量設置為全局變量即可在函數中使用,與子窗口訪問父窗口的全局變量方法類似,這里不再贅述。
2.參數傳遞方式
參數傳遞方式主要思想為利用主對話框類的this指針,將主對話框類的this指針作為參數傳遞到函數中
成功實現
這里需要說明一點:指針的相互轉換
利用窗口指針(CWnd*)獲取窗口句柄(HWND)
HWND hDlg = pDlg->GetSafeWnd();
利用窗口句柄(HWND)獲取窗口指針(CWnd*)
CWnd* pWnd = CWnd::FromHandle(hDlg);
總結
Windows程序設計29:對話框之間的數據傳遞。