1. 程式人生 > >關於MFC中 父視窗與子視窗 子視窗與子視窗之間的資訊傳遞及控制

關於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不運算元視窗。