如何優雅的寫UI——(3)添加MFC選項卡
窗體創建完成,接下來我們講講控件的使用
首先在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選項卡