VS2010-MFC(常用控件:標簽控件Tab Control 下)


 

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

 

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

 

       標簽控件的創建

       MFC為標簽控件的操作提供了CTabCtrl類。

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

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

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

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

       TCS_FIXEDWIDTH :所有標簽具有相同的寬度。

       TCS_MULTILINE:標簽以多行顯示,如果需要,可以顯示所有標簽。

       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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM