關於MFC中 父視窗與子視窗 子視窗與子視窗之間的資訊傳遞及控制
因為專案的需要,某子視窗B的設定變動,經常需要聯動其他子視窗C,或者父視窗A控制元件的名稱更新,資料更新等等問題。再網上查了許久,不得解
,特拋磚引玉,提供幾種思路。
以下都以A為父視窗,A1為A中的Tab控制元件, B和C為子視窗被非模態創建於A1上,所以之間的關係為
A
|
A1 A2 A3 (An為A上控制元件)
|
B C
|
C1 C2 C3 (Cn 為C上控制元件)
一、傳送訊息
1、自定義訊息,網上很多
自定義訊息中,加入自己要更新的訊息內容,如果控制元件顏色,文字等等。
2、在A類中定義C類的物件page2
即可通過呼叫page2.SendMessage(WM_MYMSG, NULL, NULL); 實現。
二、如果在C中的控制元件要控制A2的資料顯示。
GetParent()->GetParent()->SetDlgItemText(A2, "XXXXX"); 實現。
其中,第一個getparent()獲得A1的視窗指標,第二個getparent()獲得A的視窗指標。
三、通過二可以知道,其實每個控制元件都是一個子視窗,它可以包含其他子視窗,成為Parent.
我們通過GetParent()或的A1的視窗指標之後,可以通過FindWindow()等其他方式獲得C的視窗指標,然後進行如二中的操作。
// TODO: 在此新增控制元件通知處理程式程式碼 TCHAR className[MAX_PATH], WinText[MAX_PATH]; CString str; HWND hWnd =::GetWindow(m_hWnd, GW_CHILD); while(hWnd != NULL) { HWND hhWnd = ::GetWindow(hWnd, GW_CHILD); while(hhWnd != NULL) { ::GetWindowText(hhWnd, className, MAX_PATH); MessageBox(className); hhWnd = ::GetWindow(hhWnd, GW_HWNDNEXT); } ::GetWindowText(hWnd, className, MAX_PATH); MessageBox(className); hWnd = ::GetWindow(hWnd, GW_HWNDNEXT); }
四、剛發現的一種方式,比如主對話方塊中MainDlg.cpp 中,子類或者對話方塊中Page.cpp中使用主對話方塊的資源。
1、在MainDlg.cpp中 傳輸自己的物件到Page.cpp中。 PageX.SetDlgPtr(this);
2、在Page.cpp中成員函式: void SetDlgPtr(class MainDlg *p){ m_pDlg = p; } 成員變數: class MainDlg *m_pDlg;
3、使用m_pDlg使用MainDlg中的函式控制控制元件的顯示資訊。五、 其他
1、GetWindowedChildCount();獲得子視窗的個數。static不運算元視窗。