天天看點

VC下制作一個類似于BCB的GroupBox的控件

      如果大家用過其它一些面向對象的進階語言(如:BCB 、 DELPHI 、 VB 等)可能會用到裡面的GroupBox控件或者Panel控件,隻要将其它控件拖入這兩個控件裡面,可以控件一起顯示、一起隐藏等功能。VC沒有提供Panel控件,但提供了一個GroupBox控件,而且這個控件隻是一個簡單的邊框而已,無法做到裡面的控件同時顯示,同時隐藏的效果。

      一次我在做一個程式時要用到Panel,VC中沒有,隻好用GroupBox代替,但我發現了上述問題。于是我想到了控件的SetParent()函數,使用這個函數确實可以達到其它控件随GroupBox同時顯示或隐藏,但同時也出現了一系列新的問題,最顯著的問題就是使用了SetParent()函數後,控件無法執行原來的成員函數。後來我想到一個新的辦法:寫一個GroupBox的擴充類,用CPtrArray數組管理所有所需的控件。好,不多說,現在開始

  1. 建立一個基于對話框的程式。建立一個類,類名為 CGroupBoxEx ,基類為CButton
  2. 重載 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 函數隻是為了以後友善建立控件,可以改其中的參數

  3. 在 CGroupBoxEx 類中添加私有變量或者保護變量 m_ChildList ,類型為 CPtrArray ,用于管理子控件
  4. 添加公有函數void AddChild(void *pChild); 用于添加子控件的指針到 m_ChildList 中void CGroupBoxEx::AddChild(void *pChild)

    {

    m_ChildList.Add(pChild);

  5. 重載 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);

  6. 到此已經完成了,當然還要在 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 下編譯通過源碼我就不打包上傳了

繼續閱讀