轉自: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。
轉載于:https://www.cnblogs.com/Tang-tangt/p/9467578.html