天天看點

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. 再運作程式,最終的标簽頁切換效果如下面兩圖:

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

       經過兩講内容,終于把标簽控件的主要知識講完了。如果想了解更多的相關内容,可以檢視MSDN。

轉載于:https://www.cnblogs.com/Tang-tangt/p/9467578.html