如果大家用過其它一些面向對象的進階語言(如:BCB 、 DELPHI 、 VB 等)可能會用到裡面的GroupBox控件或者Panel控件,隻要将其它控件拖入這兩個控件裡面,可以控件一起顯示、一起隐藏等功能。VC沒有提供Panel控件,但提供了一個GroupBox控件,而且這個控件隻是一個簡單的邊框而已,無法做到裡面的控件同時顯示,同時隐藏的效果。
一次我在做一個程式時要用到Panel,VC中沒有,隻好用GroupBox代替,但我發現了上述問題。于是我想到了控件的SetParent()函數,使用這個函數确實可以達到其它控件随GroupBox同時顯示或隐藏,但同時也出現了一系列新的問題,最顯著的問題就是使用了SetParent()函數後,控件無法執行原來的成員函數。後來我想到一個新的辦法:寫一個GroupBox的擴充類,用CPtrArray數組管理所有所需的控件。好,不多說,現在開始
- 建立一個基于對話框的程式。建立一個類,類名為 CGroupBoxEx ,基類為CButton
-
重載 CGroupBoxEx 類的 Create 函數BOOL Create(LPCTSTR lpCaption, RECT &rect,CWnd *pParentWnd,UINT nID=0); ,函數代碼如下:BOOL CGroupBoxEx::Create(
LPCTSTR lpCaption, // 标題
RECT &rect, // 矩形位置
CWnd *pParentWnd, // 父視窗
UINT nID // 控件ID(因為以後用指針操作控件,是以這個參數可以不要,下面的uID改為0)
)
{
return CButton::Create(lpCaption,WS_CHILD|WS_VISIBLE|BS_GROUPBOX,rect,pParentWnd,nID);
} 重載 Create 函數隻是為了以後友善建立控件,可以改其中的參數
- 在 CGroupBoxEx 類中添加私有變量或者保護變量 m_ChildList ,類型為 CPtrArray ,用于管理子控件
-
添加公有函數void AddChild(void *pChild); 用于添加子控件的指針到 m_ChildList 中void CGroupBoxEx::AddChild(void *pChild)
{
m_ChildList.Add(pChild);
}
-
重載 CGroupBoxEx 類的 ShowWindow 函數int ShowWindow(int nCmdShow); int CGroupBoxEx::ShowWindow(int nCmdShow)
{
// 周遊數組
for(int i=0;i<m_ChildList.GetSize();i++)
((CWnd*)m_ChildList.GetAt(i))->ShowWindow(nCmdShow);
return CButton::ShowWindow(nCmdShow);
}
- 到此已經完成了,當然還要在 CGroupBoxEx 類中的析構函數中釋放數組m_ChildList.RemoveAll();
現在 CGroupBoxEx 已經完成了,在對話框中随便添加幾個控件,和兩個按鈕控件,并在對話框類中添加變量 CGroupBoxEx *pGroup;
在對話框初始化函數中添加以下代碼pGroup=new CGroupBoxEx;
CRect rect;
this->GetClientRect(&rect);
rect.bottom=rect.bottom/2;
pGroup->Create(_T("Hello World"),rect,this); // 建立控件
pGroup->AddChild(GetDlgItem(IDC_BUTTON1)); // 添加子控件到 pGroup 中
......
然後在其它兩個按鈕控件中分别加上
1.pCroup->ShowWindow(SW_SHOW); // 顯示
2.pCroup->ShowWindow(SW_HIDE); // 隐藏
運作看看,怎麼樣?
大家還可以再擴充一下類,添加自己所需要的代碼。
以上代碼在 Windows XP Professional SP3 + Visual C++ 6.0 下編譯通過源碼我就不打包上傳了