鸡啄米vc++2010系列32(标签控件Tab Control 下)
? ?上一節中雞啄米講了標簽控件知識的上半部分,本節繼續講下半部分。
???????標簽控件的創建
???????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。雞啄米最后還是謝謝各位的關注和支持。
轉載地址:http://www.jizhuomi.com/software/207.html
轉載于:https://www.cnblogs.com/zfluo/p/5131893.html
總結
以上是生活随笔為你收集整理的鸡啄米vc++2010系列32(标签控件Tab Control 下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pewell推子电池多少钱一个?
- 下一篇: jsp 环境配置记录