1. 程式人生 > >如何優雅的寫UI——(3)添加MFC選項卡

如何優雅的寫UI——(3)添加MFC選項卡

ram 動態 dial 樣式 分享 顯示 creat rect alt

窗體創建完成,接下來我們講講控件的使用

首先在CFormView窗體下選項卡的成員變量,這裏我選擇MFC下的選項卡類庫:CMFCTabCtrl

class CtabView : public CFormView
{
    ......
    ......
    public:
          CMFCTabCtrl m_tab;      
    
}    

在初始化中動態創建選項卡並設置選項卡的樣式,這裏我們使用了Creat函數,他的原型是

BOOL Create(Style style, const RECT& rect, CWnd* pParentWnd, UINT nID, Location location = LOCATION_BOTTOM, BOOL bCloseBtn = FALSE);

第一個參數 Style style

是一個枚舉類型,它定義了選項卡的樣式,基本都為3D的樣式

public:
CMFCTabCtrl();

enum Style
{
STYLE_3D = 0,
STYLE_FLAT = 1,
STYLE_FLAT_SHARED_HORZ_SCROLL = 2,
STYLE_3D_SCROLLED = 3,
STYLE_3D_ONENOTE = 4,
STYLE_3D_VS2005 = 5,
STYLE_3D_ROUNDED = 6,
STYLE_3D_ROUNDED_SCROLL = 7,
};

第二個參數:設置選項卡大小

第三個參數:窗體句柄

第四個參數:設置選項卡控件ID

第五個參數:設置選項卡標簽位置,MFC只給了上下兩個方向來顯示選項卡標簽的位置

public:
CMFCBaseTabCtrl();

enum Location
{
LOCATION_BOTTOM = 0,
LOCATION_TOP = 1
};

第六個參數:是否帶關閉按鈕,關閉按鈕的邏輯是要自己實現的,這個我們下面再說。

添加選項卡代碼:

void CtabView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

CRect rc;
GetClientRect(rc);
if (!m_tab.Create(CMFCTabCtrl::STYLE_3D_ONENOTE, rc, this, CMFCTabCtrl::RESIZE_HORIZ, CMFCTabCtrl::LOCATION_TOP))
{
return ;
}
}

創建好的選顯卡是光禿禿的沒有任何標簽頁的,這個需要我們手動添加

技術分享圖片

如何給選項卡創建標簽頁 ,這需要我們新建窗體在選項卡中顯示

創建三個Dialog窗體備用

技術分享圖片

給窗體添加類,自動生成就可以

技術分享圖片

之後咱們給選項卡添加標簽頁,在選項卡中引用我們剛剛新建的Dialog類的指針

#include "Dialog1.h"
#include "Dialog2.h"
#include "Dialog3.h"

class CtabView : public CFormView
{
    public:
    CMFCTabCtrl m_tab;
    CDialog1 *m_dlg1;
    CDialog2 *m_dlg2;
    CDialog3 *m_dlg3;

}

在程序初始化時動態創建的窗體

void CtabView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();

CRect rc;
GetClientRect(rc);
if (!m_tab.Create(CMFCTabCtrl::STYLE_3D_ONENOTE, rc, this, 3000, CMFCTabCtrl::LOCATION_TOP,0))
{
return ;
}

m_dlg1=new CDialog1;
m_dlg2=new CDialog2;
m_dlg3=new CDialog3;

m_dlg1->Create(IDD_DIALOG1,&m_tab);
m_dlg1->SetFont(&afxGlobalData.fontRegular);
//m_dlg1->SetWindowTextW(L"Listctrl控件");

m_dlg2->Create(IDD_DIALOG2,&m_tab);
m_dlg2->SetFont(&afxGlobalData.fontBold);
//m_dlg2->SetWindowTextW(L"還沒想好些什麽控件");

m_dlg3->Create(IDD_DIALOG3,&m_tab);
m_dlg3->SetFont(&afxGlobalData.fontDefaultGUIBold);
/*m_dlg3->SetWindowTextW(L"還有什麽控件比較難寫嗎");*/

m_tab.AddTab(m_dlg1,L"Listctrl控件");
m_tab.AddTab(m_dlg2,L"還沒想好些什麽控件");
m_tab.AddTab(m_dlg3,L"還有什麽控件比較難寫嗎");


m_tab.EnableActiveTabCloseButton();//是否添加關閉選項卡按鈕
m_tab.SetActiveTab(0); //激活選項卡,以當前選項卡為第一頁。

}

運行一下看一下效果

技術分享圖片

看起來還可以,但是當我們點擊標簽頁的時候會發現,我們的窗體是彈出式的並不是嵌入式,這是因為我門少了少了一步,導致窗體在創建的時候是以彈出的方式打開。

技術分享圖片

打開窗體屬性,將Style屬性由彈出Popup改為Child子窗口,所有的標簽用的窗體都要這麽改

技術分享圖片

效果

技術分享圖片

裏面的窗體太難看了了,把邊框和標題去掉就好了

窗體屬性,把Border改為None就好了

最終效果

技術分享圖片

如何優雅的寫UI——(3)添加MFC選項卡