轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2021-04-22 10:41:20.293|閱讀 916 次
概述:MFC為標(biāo)簽控件的操作提供了CTabCtrl類。與之前的控件類似,創(chuàng)建標(biāo)簽控件可以在對話框模板中直接拖入Tab Control,也可以使用CTabCtrl類的Create成員函數(shù)創(chuàng)建。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
上一節(jié)中講了標(biāo)簽控件知識的上半部分,本節(jié)繼續(xù)講下半部分。在開始前我們先介紹一下MFC界面庫:
Xtreme Toolkit Pro:是屢獲殊榮的VC界面庫,是MFC開發(fā)中最全面界面控件套包,它提供了Windows開發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
標(biāo)簽控件的創(chuàng)建
MFC為標(biāo)簽控件的操作提供了CTabCtrl類。
與之前的控件類似,創(chuàng)建標(biāo)簽控件可以在對話框模板中直接拖入Tab Control,也可以使用CTabCtrl類的Create成員函數(shù)創(chuàng)建。Create函數(shù)的原型如下:
virtual BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
參數(shù)dwStyle為標(biāo)簽控件的風(fēng)格,rect為標(biāo)簽控件的位置和大小,pParentWnd為指向標(biāo)簽控件父窗口的指針,nID指定標(biāo)簽控件的ID。這里還是要具體說下dwStyle,下面列出了幾種主要的控件風(fēng)格:
TCS_BUTTONS:標(biāo)簽(控件上部用來選擇標(biāo)簽頁的位置)外觀為按鈕風(fēng)格,且整個控件周圍沒有邊框。
TCS_FIXEDWIDTH :所有標(biāo)簽具有相同的寬度。
TCS_MULTILINE:標(biāo)簽以多行顯示,如果需要,可以顯示所有標(biāo)簽。
TCS_SINGLELINE:只顯示一行標(biāo)簽,用戶可以滾動著看其他標(biāo)簽。
TCS_TABS:標(biāo)簽以普通標(biāo)簽樣式顯示,且整個控件周圍有邊框。
如果想了解標(biāo)簽控件的所有風(fēng)格,可以查閱MSDN。
CTabCtrl類的主要成員函數(shù)
int GetCurSel( ) const;
獲取標(biāo)簽控件中當(dāng)前選擇標(biāo)簽的索引。如果成功則返回選擇標(biāo)簽的索引,否則返回-1。
BOOL GetItem(int nItem,TCITEM* pTabCtrlItem) const;
獲取標(biāo)簽控件中某個標(biāo)簽的信息。參數(shù)nItem為標(biāo)簽索引,pTabCtrlItem為指向TCITEM結(jié)構(gòu)體的指針,用來接收標(biāo)簽信息。若獲取成功返回TRUE,否則返回FALSE。
int GetItemCount( ) const;
獲取標(biāo)簽控件中標(biāo)簽的數(shù)量。
int SetCurSel(int nItem);
在標(biāo)簽控件中選擇某標(biāo)簽。參數(shù)nItem為要選擇的標(biāo)簽的索引。如果成功則返回之前選擇標(biāo)簽的索引,否則返回-1。
BOOL SetItem(int nItem,TCITEM* pTabCtrlItem);
設(shè)置某標(biāo)簽的所有或部分屬性。參數(shù)nItem為標(biāo)簽的索引,pTabCtrlItem為指向TCITEM結(jié)構(gòu)體的指針,包含了新的標(biāo)簽屬性。成功則返回TRUE,否則返回FALSE。
BOOL DeleteAllItems( );
刪除標(biāo)簽控件中所有標(biāo)簽。
BOOL DeleteItem(int nItem);
刪除標(biāo)簽控件中的某個標(biāo)簽。參數(shù)nItem為要刪除標(biāo)簽的索引。
LONG InsertItem(int nItem,LPCTSTR lpszItem);
在標(biāo)簽控件中插入新的標(biāo)簽。參數(shù)nItem為新標(biāo)簽的索引,lpszItem為標(biāo)簽文本字符串。如果插入成功則返回新標(biāo)簽的索引,否則返回-1。
標(biāo)簽控件的應(yīng)用實例
最后雞啄米依然是給大家寫一個簡單的實例,說明CTabCtrl類的幾個成員函數(shù)及標(biāo)簽控件通知消息等的使用方法。
此實例實現(xiàn)的功能:在一個標(biāo)簽控件中加入兩個標(biāo)簽頁,標(biāo)簽文本分別為“雞啄米”和“Android開發(fā)網(wǎng)”,點擊不同的標(biāo)簽顯示不同的標(biāo)簽頁。下面是具體實現(xiàn)步驟:
1. 創(chuàng)建一個基于對話框的MFC工程,名稱設(shè)置為“Example33”。
2. 在自動生成的對話框模板IDD_EXAMPLE33_DIALOG中,刪除“TODO: Place dialog controls here.”靜態(tài)文本框、“OK”和“Cancel”按鈕。添加一個Tab Control控件,并為其關(guān)聯(lián)一個CTabCtrl類型的控件變量m_tab。
3. 創(chuàng)建兩個新的對話框,ID分別設(shè)為IDD_JIZHUOMI_DIALOG、IDD_ANDROID_DIALOG,兩者都將Border屬性設(shè)為None,Style屬性設(shè)為Child。在對話框模板IDD_JIZHUOMI_DIALOG中加入一個靜態(tài)文本框,Caption屬性設(shè)為“雞啄米 www.jizhuomi.com”,并為其生成對話框類CJzmDlg;在對話框模板IDD_ANDROID_DIALOG中也加入一個靜態(tài)文本框,Caption屬性設(shè)為“Android開發(fā)網(wǎng) www.jizhuomi.com/android”,并為其生成對話框類CAndroidDlg。
4. 在“Example33Dlg.h”文件中包含“JzmDlg.h”和“AndroidDlg.h”兩個頭文件,然后繼續(xù)在“Example33Dlg.h”文件中為CExample33Dlg類添加兩個成員變量:
CJzmDlg m_jzmDlg;
CAndroidDlg m_androidDlg;
5. 在CExample33Dlg對話框初始化時,我們也初始化標(biāo)簽控件。修改CExample33Dlg::OnInitDialog()函數(shù)如下:
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; // 標(biāo)簽控件客戶區(qū)的位置和大小 m_tab.InsertItem(0, _T("雞啄米")); // 插入第一個標(biāo)簽“雞啄米” m_tab.InsertItem(1, _T("Android開發(fā)網(wǎng)")); // 插入第二個標(biāo)簽“Android開發(fā)網(wǎng)” m_jzmDlg.Create(IDD_JIZHUOMI_DIALOG, &m_tab); // 創(chuàng)建第一個標(biāo)簽頁 m_androidDlg.Create(IDD_ANDROID_DIALOG, &m_tab); // 創(chuàng)建第二個標(biāo)簽頁 m_tab.GetClientRect(&tabRect); // 獲取標(biāo)簽控件客戶區(qū)Rect // 調(diào)整tabRect,使其覆蓋范圍適合放置標(biāo)簽頁 tabRect.left += 1; tabRect.right -= 1; tabRect.top += 25; tabRect.bottom -= 1; // 根據(jù)調(diào)整好的tabRect放置m_jzmDlg子對話框,并設(shè)置為顯示 m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); // 根據(jù)調(diào)整好的tabRect放置m_androidDlg子對話框,并設(shè)置為隱藏 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. 運行程序,查看結(jié)果,這時我們發(fā)現(xiàn)切換標(biāo)簽時,標(biāo)簽頁并不跟著切換,而總是顯示CJzmDlg對話框。
7. 我們要實現(xiàn)的是標(biāo)簽頁的切換效果,所以還要為m_tab標(biāo)簽控件的通知消息TCN_SELCHANGE添加處理函數(shù),并修改如下:
C++代碼
void CExample33Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: Add your control notification handler code here *pResult = 0; CRect tabRect; // 標(biāo)簽控件客戶區(qū)的Rect // 獲取標(biāo)簽控件客戶區(qū)Rect,并對其調(diào)整,以適合放置標(biāo)簽頁 m_tab.GetClientRect(&tabRect); tabRect.left += 1; tabRect.right -= 1; tabRect.top += 25; tabRect.bottom -= 1; switch (m_tab.GetCurSel()) { // 如果標(biāo)簽控件當(dāng)前選擇標(biāo)簽為“雞啄米”,則顯示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; // 如果標(biāo)簽控件當(dāng)前選擇標(biāo)簽為“Android開發(fā)網(wǎng)”,則隱藏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. 再運行程序,最終的標(biāo)簽頁切換效果如下面兩圖:
經(jīng)過兩講內(nèi)容,終于把標(biāo)簽控件的主要知識講完了。如果想了解更多的相關(guān)內(nèi)容,可以查看MSDN。雞啄米最后還是謝謝各位的關(guān)注和支持。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: