程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Visual C++中Tab View的多種完成辦法

Visual C++中Tab View的多種完成辦法

編輯:關於C++

Visual C++中Tab View的多種完成辦法。本站提示廣大學習愛好者:(Visual C++中Tab View的多種完成辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Visual C++中Tab View的多種完成辦法正文


本文實例講述了Visual C++中Tab View的多種完成辦法,分享給年夜家供年夜家參考。詳細以下:

1、引言

標簽控件(Tab Control)是VC++編程中常常應用的控件之一,它許可在單個對話框或窗口中設置多個頁面,每一個頁面代表一組控件。當某個頁面的標簽被選中時,該頁 面內的控件就會被顯示出來。標簽控件使得在無限的窗口空間內可以顯示更多的信息,並且分類清楚。同時,VC++供給了以文檔/視圖 (Document/View)構造方法開辟運用法式的簡略辦法,在文檔中保留數據,在視圖中顯示數據。不管是在SDI照樣MDI的法式中,每一個文檔可以 對應一個或多個是視圖,但經常在顯示數據時,須要將統一組數據用分歧的視圖顯示,如列表視圖、樹型視圖等,或許用一個視圖顯示一部門數據,用另外一個視圖顯 示另外一部門數據,而且願望能在統一個顯示區顯示,在須要時停止切換。將標簽掌握應用到多視圖的切換中,就構成了Tab View。
經由過程下面的剖析,我們不難發明,完成一個Tab View重要要完成以下兩方面的任務:

① 完成一個標簽窗口。它要具有繪制窗口、呼應用戶選擇、斷定處置用戶選擇等功效。本文對Tab View 完成辦法的分類就是依據標簽窗口分歧劃分的。

② 多個視圖之間的切換。依據標簽窗口斷定用戶選擇的成果,從多個視圖當選擇一個,在顯示區中顯示。

本文剖析和總結了三種Tab View的完成辦法:

1)應用CTabCtrl控件完成Tab View.
2)應用CSheetCtrl標簽選擇窗話柄現Tab View.
3)應用靜態朋分窗話柄現Tab View.

2、CTabCtrl控件完成Tab View

CTabCtrl是MFC類庫中界說的尺度控件類,經由過程抵消息TCN-SELCHANGE的處置和應用函數GetCurSel()、 SetCurSel()等,可以很好地完成呼應、斷定和設置標簽掌握的任務,是以應用CTabCtrl控件完成Tab View是較輕易的辦法。

1.完成的重要類
//要切換顯示的視窗口類
class CMyView1 : public CListView
class CMyView2 : public CView
     //派生的標簽控件類
class CViewTabCtrl : public CTabCtrl
     //界說了Tab view的主窗口
class CTabCtrlView : public CWnd
{
    protected:
       CViewTabCtrl m_TabCtl;
    …
}
class CMainFrame : public CFrameWnd
{
      CTabCtrlView m_TabView;
 …
}
2.窗口之間的父子關系和地位關系
下述代碼肯定各窗口之間的地位關系。
void CTabCtrlView::RecalcLayout()
{    …
  CRect rect;
  // CTabCtrlView窗口的客戶區年夜小
  GetClientRect(&rect);
  m_TabCtl.RecalcLayout(rect, pWnd);
  …
}
void CViewTabCtrl::RecalcLayout(CRect & rect, CWnd * wnd)
{
  //標簽控件占領CTabCtrlView窗口的客戶區
  SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left,
        rect.bottom - rect.top, SWP_NOZORDER);
  //調劑要顯示的視窗口地位,使其占領標簽控件的顯示區
  AdjustRect(FALSE, &rect);
  wnd->SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left,
      rect.bottom - rect.top, SWP_NOZORDER);
}
3.多個視之間切換的完成
視的切換重要完成上面的任務:
// 步調1:設置以後運動的子窗口的ID
CView* pOldActiveView = GetActiveView();
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_nCurrentExample);
// 步調2:生成一個新的與所選擇的視窗口對應的運轉時類
CRuntimeClass* pNewViewClass;
switch (nViewID)// nViewID各個視圖的標識
{
 case ID_MYVIEW1:
     pNewViewClass = RUNTIME_CLASS(CMyView1);
     break;
 case ID_MYVIEW2:
     pNewViewClass = RUNTIME_CLASS(CMyView2);
     break;
  default:
    ASSERT(0);
    return;
}
// 步調3:預備新視圖類的相干高低文,創立新的視
CCreateContext Context;
Context.m_pNewViewClass = pNewViewClass;
Context.m_pCurrentDoc = GetActiveDocument();
CView* pNewView = m_TabView.CreateView(pNewViewClass, CSize(100,100), &Context);
if (pNewView != NULL)
{
         // 步調4:顯示新的視圖
         pNewView->ShowWindow(SW_SHOW);
         SetActiveView(pNewView);
         …
         // 步調5:封閉舊的視圖
         pOldActiveView->DestroyWindow();
}
在視圖切換進程中,都須要從新生成新視圖,封閉舊的視圖。但在某些情形下,願望多個視圖窗口可以或許同時存在,在某時辰只顯示一個,而隱蔽其它的窗口。可以經由過程界說上面的數據構造和變量,將每次參加的新視圖的窗口信息保留。
typedef struct
{
         CWnd *pWnd;   //窗口指針
         char szLabel[32]; //標簽窗口對應當視圖的字符串
}TCB_ITEM;
//將每次如入的視圖信息保留到列表中
CList <TCB_ITEM *,TCB_ITEM *> m_Views;

在切換時,經由過程函數SetWindowPos()中設置參數SWP_SHOWWINDOW或SWP_HIDEWINDOW來顯示選中的新視圖,或隱蔽舊視圖。采取這類辦法,使對視圖操作加倍靈巧,可以很便利在Tab View中添加和刪除分歧視圖。

3、CSheetCtrl標簽選擇窗話柄現Tab View

CSheetCtrl不是MFC類庫中的類,用它來完成Tab View的辦法和上一個辦法根本雷同。在法式員年夜本營網站的VC編程源代碼集的[其它掌握]分類中,” A Tab-like Sheet Ctrl”法式含有該類源代碼,但在應用時要將窗口的切換改成視圖切換。

1.標簽窗口的創立

CSheetCtrl完成的Attach( )函數,是它與內部的接口。在CTabSheetCtrl 中界說CSheetsWnd m_Sheet ,初始化進程中,經由過程挪用m_Sheet.Attach( this)將CSheetCtrl創立為CTabSheetCtrl窗口的子窗口。
BOOL CSheetsWnd::Attach(CWnd * pWndParent, COLORREF rgbBackground)
{
     //肯定了標簽窗口的年夜小和地位
     CRect rect = GetRect(pWndParent);
     …
     BOOL bResult = Create( … , rect , …);
     …
     return bResult;
}
CRect CSheetsWnd::GetRect(CWnd* pWndParent)
{
     CRect rect;
     pWndParent->GetClientRect(rect);
     rect.top = rect.bottom - GetSystemMetrics(SM_CYVTHUMB);
     return rect;
}

2.查找所選視圖窗口

CSheetCtrl完成了相似於CTabCtrl的功效,如繪制標簽窗口、斷定用戶的選擇等。它自己並沒有保留任何有關視圖的信息,在視圖切換時,它經由過程其父窗口來查找用戶所選的視圖窗口。
//獲得父窗口的第一個的視圖子窗口指針函數
CWnd* CSheetsWnd::GetFirstView()
{
     m_pViewFind = GetParent()->GetWindow(GW_CHILD);
     // m_hWnd寄存的是CSheetCtrl標簽窗口
     //消除CSheetCtrl標簽窗口
         while (m_pViewFind && m_pViewFind->m_hWnd == m_hWnd)
              m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
         return m_pViewFind;
}  
//獲得下一個視圖窗口指針函數
CWnd* CSheetsWnd::GetNextView()
{
         if (m_pViewFind)
         {
             m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
             while (m_pViewFind && m_pViewFind->m_hWnd == m_hWnd)
                  m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
             return m_pViewFind;
         }
         return NULL;
}
按必定的次序獲得一切父窗口(CTabSheetCtrl)的子窗口(CMyView1、CMyView2)指針後,依據每一個子窗口的題目所占空間地位,來肯定所選擇的視圖窗口。
//取得第一個視圖窗口指針
CWnd* pChild = GetFirstView();
while (pChild)
{
  CRect rect(cx,0,0,0);
  //rect前往繪制該窗口的題目所需的矩形年夜小
  pDC->DrawText(GetViewTitle(pChild), rect, DEFAULTFORMATDRAWTEXT | DT_CALCRECT);
  rect.top = 0;
  rect.bottom = m_DrawRect.Height();
  if ((aPointX > cx - LRB) && (aPointX   <= cx + rect.Width() + LRB))// aPointX鼠標地位的橫坐標
  break;//找到所選視圖
  //取得下一個視圖窗口的指針
  pChild = GetNextView();
  int next = rect.Width() + 6 + LRB;
  cx += next;
}

4、靜態朋分窗話柄現Tab View

用靜態朋分窗口CSplitterWnd完成Tab View,其重要的設計思惟是經由過程朋分窗口,應用splitter窗口的Pane(0,0)作為切換視的顯示區,Pane(0,1)顯示相似圖3的高等標 簽窗口CWndTab。CSplitterWnd窗口完成了下面兩種辦法中CTabCtrlView和CTabSheetView的任務,作為視的窗口和 標簽窗口的容器。此辦法的源代碼,在法式員年夜本營網站也有。

5、停止語

筆者經由過程剖析了多個相干法式的源代碼,而且在現實編程進程中,依據須要完成了本身的Tab View。在此扼要地總結了三種完成Tab View 的辦法,願望對讀者的編程能有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved