VS2010-MFC(經常使用控件:標籤控件Tab Control 下)

 

轉自:http://www.jizhuomi.com/software/207.htmlhtml

 

上一節講了標籤控件知識的上半部分,本節繼續講下半部分。android

 

       標籤控件的建立app

       MFC爲標籤控件的操做提供了CTabCtrl類。less

       與以前的控件相似,建立標籤控件能夠在對話框模板中直接拖入Tab Control,也可使用CTabCtrl類的Create成員函數建立。Create函數的原型以下:函數

virtual BOOL Create(
  DWORD dwStyle,
  const RECT& rect,
  CWnd* pParentWnd,
  UINT nID 
);this

       參數dwStyle爲標籤控件的風格,rect爲標籤控件的位置和大小,pParentWnd爲指向標籤控件父窗口的指針,nID指定標籤控件的ID。這裏仍是要具體說下dwStyle,下面列出了幾種主要的控件風格:spa

       TCS_BUTTONS:標籤(控件上部用來選擇標籤頁的位置)外觀爲按鈕風格,且整個控件周圍沒有邊框。指針

       TCS_FIXEDWIDTH :全部標籤具備相同的寬度。code

       TCS_MULTILINE:標籤以多行顯示,若是須要,能夠顯示全部標籤。htm

       TCS_SINGLELINE:只顯示一行標籤,用戶能夠滾動着看其餘標籤。

       TCS_TABS:標籤以普通標籤樣式顯示,且整個控件周圍有邊框。

       若是想了解標籤控件的全部風格,能夠查閱MSDN。

 

 

       CTabCtrl類的主要成員函數

       int GetCurSel( ) const;

       獲取標籤控件中當前選擇標籤的索引。若是成功則返回選擇標籤的索引,不然返回-1。

       BOOL GetItem(int nItem,TCITEM* pTabCtrlItem) const;

       獲取標籤控件中某個標籤的信息。參數nItem爲標籤索引,pTabCtrlItem爲指向TCITEM結構體的指針,用來接收標籤信息。若獲取成功返回TRUE,不然返回FALSE。

       int GetItemCount( ) const;

       獲取標籤控件中標籤的數量。

       int SetCurSel(int nItem);

       在標籤控件中選擇某標籤。參數nItem爲要選擇的標籤的索引。若是成功則返回以前選擇標籤的索引,不然返回-1。

       BOOL SetItem(int nItem,TCITEM* pTabCtrlItem);

       設置某標籤的全部或部分屬性。參數nItem爲標籤的索引,pTabCtrlItem爲指向TCITEM結構體的指針,包含了新的標籤屬性。成功則返回TRUE,不然返回FALSE。

       BOOL DeleteAllItems( );

       刪除標籤控件中全部標籤。

       BOOL DeleteItem(int nItem);

       刪除標籤控件中的某個標籤。參數nItem爲要刪除標籤的索引。

       LONG InsertItem(int nItem,LPCTSTR lpszItem);

       在標籤控件中插入新的標籤。參數nItem爲新標籤的索引,lpszItem爲標籤文本字符串。若是插入成功則返回新標籤的索引,不然返回-1。

 

 

       標籤控件的應用實例

       最後依然是給你們寫一個簡單的實例,說明CTabCtrl類的幾個成員函數及標籤控件通知消息等的使用方法。

       此實例實現的功能:在一個標籤控件中加入兩個標籤頁,標籤文本分別爲「雞啄米」和「Android開發網」,點擊不一樣的標籤顯示不一樣的標籤頁。下面是具體實現步驟:

       1. 建立一個基於對話框的MFC工程,名稱設置爲「Example33」。

       2. 在自動生成的對話框模板IDD_EXAMPLE33_DIALOG中,刪除「TODO: Place dialog controls here.」靜態文本框、「OK」按鈕和「Cancel」按鈕。添加一個Tab Control控件,併爲其關聯一個CTabCtrl類型的控件變量m_tab。

       3. 建立兩個新的對話框,ID分別設爲IDD_JIZHUOMI_DIALOG、IDD_ANDROID_DIALOG,二者都將Border屬性設爲None,Style屬性設爲Child。在對話框模板IDD_JIZHUOMI_DIALOG中加入一個靜態文本框,Caption屬性設爲「雞啄米 www.jizhuomi.com」,併爲其生成對話框類CJzmDlg;在對話框模板IDD_ANDROID_DIALOG中也加入一個靜態文本框,Caption屬性設爲「Android開發網 www.jizhuomi.com/android」,併爲其生成對話框類CAndroidDlg。

       4. 在「Example33Dlg.h」文件中包含「JzmDlg.h」和「AndroidDlg.h」兩個頭文件,而後繼續在「Example33Dlg.h」文件中爲CExample33Dlg類添加兩個成員變量:

       CJzmDlg m_jzmDlg;
       CAndroidDlg m_androidDlg;

       5.  在CExample33Dlg對話框初始化時,咱們也初始化標籤控件。修改CExample33Dlg::OnInitDialog()函數以下:

C++代碼
BOOL CExample33Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog  SetIcon(m_hIcon, TRUE); // Set big icon  SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here  CRect tabRect; // 標籤控件客戶區的位置和大小   m_tab.InsertItem(0, _T("雞啄米")); // 插入第一個標籤「雞啄米」  m_tab.InsertItem(1, _T("Android開發網")); // 插入第二個標籤「Android開發網」  m_jzmDlg.Create(IDD_JIZHUOMI_DIALOG, &m_tab); // 建立第一個標籤頁  m_androidDlg.Create(IDD_ANDROID_DIALOG, &m_tab); // 建立第二個標籤頁   m_tab.GetClientRect(&tabRect); // 獲取標籤控件客戶區Rect // 調整tabRect,使其覆蓋範圍適合放置標籤頁  tabRect.left += 1; tabRect.right -= 1; tabRect.top += 25; tabRect.bottom -= 1; // 根據調整好的tabRect放置m_jzmDlg子對話框,並設置爲顯示   m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); // 根據調整好的tabRect放置m_androidDlg子對話框,並設置爲隱藏   m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); return TRUE; // return TRUE unless you set the focus to a control  } 

 

 
 

       6. 運行程序,查看結果,這時咱們發現切換標籤時,標籤頁並不跟着切換,而老是顯示CJzmDlg對話框。

       7. 咱們要實現的是標籤頁的切換效果,因此還要爲m_tab標籤控件的通知消息TCN_SELCHANGE添加處理函數,並修改以下:

C++代碼
void CExample33Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: Add your control notification handler code here  *pResult = 0; CRect tabRect; // 標籤控件客戶區的Rect // 獲取標籤控件客戶區Rect,並對其調整,以適合放置標籤頁  m_tab.GetClientRect(&tabRect); tabRect.left += 1; tabRect.right -= 1; tabRect.top += 25; tabRect.bottom -= 1; switch (m_tab.GetCurSel()) { // 若是標籤控件當前選擇標籤爲「雞啄米」,則顯示m_jzmDlg對話框,隱藏m_androidDlg對話框  case 0: m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); break; // 若是標籤控件當前選擇標籤爲「Android開發網」,則隱藏m_jzmDlg對話框,顯示m_androidDlg對話框  case 1: m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); break; default: break; } }  

 

 

       8. 再運行程序,最終的標籤頁切換效果以下面兩圖:

 

 

 

       通過兩講內容,終於把標籤控件的主要知識講完了。若是想了解更多的相關內容,能夠查看MSDN。

相關文章
相關標籤/搜索