天天看點

CMFCTABCTRL 簡介及BUG處理

 CMFCTabCtrl類主要用于分頁顯示,與CTabCtrl類似,自我認為功能比TabCtrl強大,但中間卻存在一些bug.

一、一般使用方法(vc2010同vs2008用法)

       1.對話框放置PictureCtrl,設Type=Rectangle,Visible=False,Color=Gray,ID=IDC_STATIC_TAB

       2.DDX_Control(pDX, IDC_STATIC_TAB, m_wndTabsArea);

       3.CMFCTabCtrl m_wndTabs;

       4.建立幾個對話框Border=None,Style=Child,建立Dlg類如:CApplyBus 定義對象:m_ApplyBus,對話框ID:IDD_APPLYBUS

二、建立

          OnInitDialog()

CRect rectTabs;

          m_wndTabsArea.GetWindowRect (rectTabs);

          ScreenToClient (rectTabs);

          m_wndTabs.Create (CMFCTabCtrl::STYLE_3D_ROUNDED_SCROLL, rectTabs, this, 1,CMFCTabCtrl::LOCATION_TOP);   //建立CMFCTabCtrl  m_wndTab對象

三、為m_wndTab添加頁籤

          m_ApplyBus.Create(IDD_APPLYBUS, &m_wndTab);  //建立對話框

四、得到頁籤的個數

        m_wndTab.GetTabsNum();

五、設定為活動頁籤

        m_wndTab.SetActiveTab(temptab);  //設定第temptab為活動頁籤

六、BUG處理1------------------------------------------------------關閉按鈕無法實作(參考)

        1、自己建立一個類繼承自:CMFCTabCtr l如:CMyMFCTabCtrl

        2、重載afx_msg void OnLButtonDown(UINT nFlags, CPoint point)函數,函數定義如下:

void CMyMFCTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
           {
                        CMFCTabCtrl::OnLButtonDown(nFlags, point);                        if (m_rectCloseButton.PtInRect(point))
                        {
                                        int nTab = GetActiveTab();
                                        if (nTab >= 0)
                                       {
                                                 CWnd* pWnd = GetTabWnd (nTab);
                                                  pWnd->DestroyWindow ();
                                                 //delete pWnd;
                                                  RemoveTab(nTab); 
                                       }
                         }
           }      

          3、建立時就可以直接用自己定義的類了:

          m_wndTabs.Create (CMyMFCTabCtrl::STYLE_3D_ROUNDED_SCROLL, rectTabs, this, 1,CMFCTabCtrl::LOCATION_TOP);

          後續如上。。。。。。。。。。。。

三、BUG2--------------------------------------------------------------------------------------失焦重新整理的問題

          隻需在所在類中的OnPaint()中重新整理窗體即可:

         CWnd* m_wnd=m_wndTab.GetActiveWnd();//得到活動窗體的句柄

         m_wnd->RedrawWindow();//使窗體重畫

 CMFCTabCtrl類主要用于分頁顯示,與CTabCtrl類似,自我認為功能比TabCtrl強大,但中間卻存在一些bug.

一、一般使用方法(vc2010同vs2008用法)

       1.對話框放置PictureCtrl,設Type=Rectangle,Visible=False,Color=Gray,ID=IDC_STATIC_TAB

       2.DDX_Control(pDX, IDC_STATIC_TAB, m_wndTabsArea);

       3.CMFCTabCtrl m_wndTabs;

       4.建立幾個對話框Border=None,Style=Child,建立Dlg類如:CApplyBus 定義對象:m_ApplyBus,對話框ID:IDD_APPLYBUS

二、建立

          OnInitDialog()

CRect rectTabs;

          m_wndTabsArea.GetWindowRect (rectTabs);

          ScreenToClient (rectTabs);

          m_wndTabs.Create (CMFCTabCtrl::STYLE_3D_ROUNDED_SCROLL, rectTabs, this, 1,CMFCTabCtrl::LOCATION_TOP);   //建立CMFCTabCtrl  m_wndTab對象

三、為m_wndTab添加頁籤

          m_ApplyBus.Create(IDD_APPLYBUS, &m_wndTab);  //建立對話框

四、得到頁籤的個數

        m_wndTab.GetTabsNum();

五、設定為活動頁籤

        m_wndTab.SetActiveTab(temptab);  //設定第temptab為活動頁籤

六、BUG處理1------------------------------------------------------關閉按鈕無法實作(參考)

        1、自己建立一個類繼承自:CMFCTabCtr l如:CMyMFCTabCtrl

        2、重載afx_msg void OnLButtonDown(UINT nFlags, CPoint point)函數,函數定義如下:

void CMyMFCTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
           {
                        CMFCTabCtrl::OnLButtonDown(nFlags, point);                        if (m_rectCloseButton.PtInRect(point))
                        {
                                        int nTab = GetActiveTab();
                                        if (nTab >= 0)
                                       {
                                                 CWnd* pWnd = GetTabWnd (nTab);
                                                  pWnd->DestroyWindow ();
                                                 //delete pWnd;
                                                  RemoveTab(nTab); 
                                       }
                         }
           }      

          3、建立時就可以直接用自己定義的類了:

          m_wndTabs.Create (CMyMFCTabCtrl::STYLE_3D_ROUNDED_SCROLL, rectTabs, this, 1,CMFCTabCtrl::LOCATION_TOP);

          後續如上。。。。。。。。。。。。