亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

Visual C++中Tab View的多種實現方法

2020-01-26 15:13:43
字體:
來源:轉載
供稿:網友

本文實例講述了Visual C++中Tab View的多種實現方法,分享給大家供大家參考。具體如下:

一、引言

標簽控件(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.

二、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中添加和刪除不同視圖。

三、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;
}

四、靜態分割窗口實現Tab View

用靜態分割窗口CSplitterWnd實現Tab View,其主要的設計思想是通過分割窗口,使用splitter窗口的Pane(0,0)作為切換視的顯示區,Pane(0,1)顯示類似圖3的高級標 簽窗口CWndTab。CSplitterWnd窗口完成了上面兩種方法中CTabCtrlView和CTabSheetView的工作,作為視的窗口和 標簽窗口的容器。此方法的源代碼,在程序員大本營網站也有。

五、結束語

筆者通過分析了多個相關程序的源代碼,并且在實際編程過程中,根據需要實現了自己的Tab View。在此簡要地總結了三種實現Tab View 的方法,希望對讀者的編程能有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产不卡av在线免费观看| 日韩av网址在线观看| 98精品国产自产在线观看| 亚洲一区二区三区四区视频| 国产欧美va欧美va香蕉在| 日韩中文字幕亚洲| 国产成人精品在线观看| 色久欧美在线视频观看| 精品无人区太爽高潮在线播放| 亚洲综合自拍一区| 国产97人人超碰caoprom| 国产网站欧美日韩免费精品在线观看| 欧美激情一区二区三区在线视频观看| 久久夜色撩人精品| 久久久久久69| 欧美国产精品va在线观看| 最近2019中文字幕大全第二页| 日韩中文字幕在线视频| 国产91精品网站| 国产精品日韩一区| 日韩一区二区福利| 午夜欧美不卡精品aaaaa| 91香蕉亚洲精品| 亚洲小视频在线| 久久精品电影网站| 米奇精品一区二区三区在线观看| 国产精品精品一区二区三区午夜版| 国产精品久久久久秋霞鲁丝| 欧洲成人在线视频| 伊人久久久久久久久久| 欧美成年人视频网站| 91色精品视频在线| 日韩av手机在线观看| 久久电影一区二区| 国产精品最新在线观看| 最近2019年好看中文字幕视频| 国产精品吊钟奶在线| 欧美精品久久久久久久久久| 欧美色视频日本高清在线观看| 成人免费看吃奶视频网站| 日韩电影中文字幕一区| 日韩一区二区在线视频| 欧美国产一区二区三区| 日韩一区二区三区国产| 亚洲一区精品电影| 国产精品高清在线| 中文字幕久久久| 精品视频久久久久久久| 欧美福利视频在线| 久久久久久久国产精品视频| 最新亚洲国产精品| 欧美性猛交xxxx乱大交| 9.1国产丝袜在线观看| 亚洲精品一区中文| 日韩在线观看视频免费| 精品亚洲一区二区三区四区五区| 黄色精品一区二区| 欧美巨猛xxxx猛交黑人97人| 成人h视频在线观看播放| 欧美大片大片在线播放| 奇米影视亚洲狠狠色| 国产成人精品免高潮在线观看| 国内伊人久久久久久网站视频| 日韩a**站在线观看| 久久久久久久久久久91| 精品亚洲一区二区三区| 亚洲国产欧美日韩精品| 欧美极品少妇xxxxⅹ免费视频| 亚洲v日韩v综合v精品v| 精品香蕉一区二区三区| 日韩成人性视频| 91在线免费看网站| 国产欧美婷婷中文| 俺去了亚洲欧美日韩| 96sao精品视频在线观看| 亚洲人成在线免费观看| 97视频在线观看视频免费视频| 欧美福利在线观看| 美日韩丰满少妇在线观看| 狠狠操狠狠色综合网| 亚洲欧美在线看| 91精品国产91久久久久久久久| 亚洲毛片在线看| 国产精品ⅴa在线观看h| 国产亚洲一区二区精品| 亚洲毛片在线观看| 韩国19禁主播vip福利视频| 国产91|九色| 国产在线拍偷自揄拍精品| 97热在线精品视频在线观看| 国产福利精品视频| 伊人青青综合网站| 欧美日韩美女在线观看| 欧美精品亚州精品| 国产亚洲美女久久| 欧美限制级电影在线观看| 欧美成人精品一区二区三区| 一个人看的www欧美| 欧美极品少妇全裸体| 国产精品视频播放| 日韩中文字幕精品视频| 欧美日韩亚洲精品内裤| 中文字幕日韩av综合精品| 91九色精品视频| 黑人精品xxx一区一二区| 久久免费视频观看| 精品国产一区二区三区久久狼黑人| 国外日韩电影在线观看| 久久久久久久久久亚洲| 不卡在线观看电视剧完整版| 亚洲人在线视频| 黄色一区二区三区| 成人黄色影片在线| 欧美肥臀大乳一区二区免费视频| 欧美在线xxx| 国产成人综合精品在线| 亚洲午夜激情免费视频| 欧美性高潮床叫视频| 最新69国产成人精品视频免费| 日韩欧美在线播放| 亚洲精品av在线播放| 欧美黄色免费网站| 少妇高潮久久久久久潘金莲| 国产成人avxxxxx在线看| 久久午夜a级毛片| 51ⅴ精品国产91久久久久久| 欧美一级在线亚洲天堂| 视频直播国产精品| 日韩中文字幕在线视频| 91精品国产91久久久久久| 欧美另类精品xxxx孕妇| 亚洲免费av片| 亚洲精品国产精品乱码不99按摩| 国产精品美女主播| 欧美福利视频在线观看| 日韩精品视频观看| 成人有码在线播放| 国内精品久久久久影院优| 国产欧美欧洲在线观看| 亚洲偷熟乱区亚洲香蕉av| 日韩精品久久久久久久玫瑰园| 亚洲天堂第二页| 日韩欧美成人精品| 欧美日韩国产第一页| 黄色精品一区二区| 日韩中文字幕第一页| 亚洲国产高清高潮精品美女| 九九热精品视频国产| 久久精品99国产精品酒店日本| 久久久精品国产亚洲| 久久影视电视剧免费网站| 亚洲xxxxx性| 欧美日韩精品二区| 欧美一区视频在线| 91影院在线免费观看视频| 成人激情春色网| www.欧美三级电影.com| 91在线观看免费观看| 色婷婷成人综合| 欧美高跟鞋交xxxxxhd| 欧美高清视频在线观看| 久热精品视频在线观看一区| 欧美一级淫片aaaaaaa视频| 国产日韩欧美中文|