Tab控件的使用

转载 2013年12月03日 10:12:01

转自http://blog.csdn.net/xianglitian/article/details/5618814

 

经常能在论坛上见人问tab控件应该如何使用,总是有很多网友热心的解答。回想起自己初学MFC的时候对于这个问题也是比较纠结,也曾到处查找资料和范例。想想初学时总希望什么事情都可以轻松实现,加一个tab控件就想直接实现界面切换的功能,看到网上介绍要自己创建对话框按非模态方式调用通过tab切换自己还认为这种方法有问题,把简单问题复杂化了。呵呵,现在想想自己当时太可笑了,如今看来做程序设计不要追求简单易行,而应该更多的考虑合理规范。

      好了,闲言少叙切入正题。tab控件其实只是提供了一组标签按钮,其相互切换有响应的消息,而且实现了对这些按钮管理的功能。至于通过这些标签按钮来管理我们自己的界面那就要我们通过其提供的各种方法自己实现了,这一方面减轻了tab控件自身的设计压力,另一方面也为开发者提供了很大的灵活性和自主性,想来应该是较为合理的。

      在网络盛行、资源共享的时代,我们遇到问题第一个反应就是上网看看有没有成熟的解决方案或可用示例可供参考,至少我是这样。所以在tab控件的使用上我也是参考了一些例子,选择了一个自己认比较不错的加以改进和使用,今天就把自己现在使用的方法拿出来与大家分享一下,希望能对不了解tab控件使用的朋友有所帮助。

       按着面向对象的思想,我们应该在MFC原有CTabCtrl的基础上加以继承来扩展其功能,同时封装我们扩展出的新功能以方便今后使用,基于这种考虑我创建了CTabPage,而且制作了一个使用CTabPage的例子,这个例子中做了三个简单的对话框实现了通过tab控件实现了界面切换。具体到CTabPage其实很简单,其定义如下

  1. class CTabPage : public CTabCtrl  
  2. {  
  3.     DECLARE_DYNAMIC(CTabPage)  
  4.   
  5.     int     m_nPageCount;   //页数   
  6.   
  7. public:  
  8.     CTabPage();  
  9.     virtual ~CTabPage();  
  10.   
  11.     void    AddPage(CWnd* pPageWnd, LPTSTR lpTitle);    //添加选项卡   
  12.     void    ShowCurPage(UINT nShowState);               //显示当前页面   
  13.   
  14. public:  
  15.     afx_msg void OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult);  
  16.     afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);  
  17.   
  18.     DECLARE_MESSAGE_MAP()  
  19. };  

      其中OnTcnSelchanging和OnTcnSelchange是通过向导添加的消息函数,也是实现界面切换的关键。这两个函数在执行顺序上是OnTcnSelchanging先执行而OnTcnSelchange后执行,而且在OnTcnSelchanging执行时tab的当前选中的item没有完成切换,而在OnTcnSelchange执行时tab控件就以完成当前选中item的切换。知道了这个原理我们就可以在OnTcnSelchanging中隐藏先前选中的页面而在OnTcnSelchange显示当前选择了的页面了。而显示和隐藏页面的操作是通过自定义函数ShowCurPage完成的。看到这相信大家就会有一个疑问,我们怎么获取tab控件所管理的页面的指针或句柄呢?解决这个问题就不得不说一个结构:

  1. typedef struct tagTCITEMW  
  2. {  
  3.     UINT mask;  
  4. #if (_WIN32_IE >= 0x0300)   
  5.     DWORD dwState;  
  6.     DWORD dwStateMask;  
  7. #else   
  8.     UINT lpReserved1;  
  9.     UINT lpReserved2;  
  10. #endif   
  11.     LPWSTR pszText;  
  12.     int cchTextMax;  
  13.     int iImage;  
  14.   
  15.     LPARAM lParam;  
  16. } TCITEMW, *LPTCITEMW;  

      这个结构是CTabCtrl的item的结构,它记录了TabCtrl的item的全部信息,其中有一个LPARAM型的参数lParam可以用来存储用户附加的信息,而这个参数正好用来存储由此item控制的页面的指针,到此我们再来看AddPage和ShowCurPage的代码就可以很好的理解了

  1. void CTabPage::AddPage(CWnd *pPageWnd, LPTSTR lpTitle)  
  2. {  
  3.     TCITEM  itemPage;  
  4.   
  5.     itemPage.mask       = TCIF_TEXT|TCIF_PARAM;  
  6.     itemPage.lParam     = LPARAM(pPageWnd);  
  7.     itemPage.pszText    = lpTitle;  
  8.   
  9.     InsertItem(m_nPageCount, &itemPage);  
  10.     m_nPageCount==0?pPageWnd->ShowWindow(SW_SHOW):pPageWnd->ShowWindow(SW_HIDE);  
  11.     m_nPageCount++;  
  12. }  
  13.   
  14. void CTabPage::ShowCurPage(UINT nShowState)  
  15. {  
  16.     int     nCurItem;  
  17.     TCITEM  itemCur;  
  18.   
  19.     nCurItem        = GetCurSel();  
  20.     itemCur.mask    = TCIF_PARAM;  
  21.   
  22.     GetItem(nCurItem, &itemCur);  
  23.     ((CWnd*)itemCur.lParam)->ShowWindow(nShowState);  
  24. }  

      到此CTabPage的核心功能就已经介绍完毕了,应该说通过本文的方法实现tab控件对页面的控制是十分科学合理的,而且很多控件都有类似的item结构,也都可以通过相同或相似的方法实现模块控制。

      由于水平有限,例子制作的较为简陋,可能实现方法也有可以改进之处,还希望朋友们加以斧正,在此谢过。

MFC之Tab Control控件简单使用

在MFC当中使用Tab Control控件切换不同的界面,使用起来会复杂一些,至少是比Qt中的Tab Widget复杂得多。我接下来会以一个MFC对话框应用程序为例子,说明Tab Control控件的...
  • u010780613
  • u010780613
  • 2016年12月26日 10:15
  • 3030

例说WIN32 Tab控件使用

今天查找了一天关于SDK下,TAB控件的使用,到处都是C++的,本人还没开始学习C++,所以只能学习SDK方式使用TAB控件,搞了一天终于搞定了 ,现在在这里记录下,以便后来人有需要。 先直接上效果图...
  • liuyunjay66
  • liuyunjay66
  • 2013年07月14日 19:19
  • 2964

最简单的tab控件,纯html

http://www.w3.org/TR/xhtml2/DTD/xhtml1-strict.dtd">http://www.w3.org/1999/xhtml" xml:lang="en">.tab{...
  • kongxiangli
  • kongxiangli
  • 2009年04月03日 11:52
  • 5847

VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)

上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分。        标签控件的创建        MFC为标签控件的操作提供了CTabCtrl类。        与之前的控件类似,...
  • my_lord_
  • my_lord_
  • 2016年08月24日 21:14
  • 420

MFC的TAB控件使用详细说明

MFC的TAB控件使用详细说明       在MFC当中使用Tab Control控件切换不同的界面,对于新手使用起来有点难度,本人研究了一天下面将详细介绍自己遇到的问题及使用步骤, 1.1建立一...
  • qq_38204688
  • qq_38204688
  • 2017年07月18日 13:49
  • 200

MFC TAB控件,关于窗口之间控件操作问题

主窗体上用了一个tab控件 我想在第一个TAB页面上做事件去修改第二个TAB上的一个文本 请问可以如何做? 有么有办法可以所有窗口共享变量...
  • jiaoqiuzhe8520
  • jiaoqiuzhe8520
  • 2017年01月18日 22:59
  • 110

MFC中tab control控件的使用方法

一、新建一个MFC工程, 取名Tabctrl, 选择基于对话框, 然后点完成。   二、删除对话框上默认添加的三个控件,添加Tab Control控件,属性设置:ID:IDC_TAB1    ...
  • xinm1001
  • xinm1001
  • 2016年10月06日 20:33
  • 1139

VS2010 MFC中tab control使用方法

1、在已有工程中添加tab contr控件 2、为tab control控件添加变量m_tabctrl 3. 在CXXXDlg类中的对话框初始化函数OnInitDialog里面添加如下代码: //添加...
  • csdn1507
  • csdn1507
  • 2017年11月09日 10:31
  • 216

VB 实现VC TAbControl控件

VB实现VC TabControl控件 新建一个工程文件Project1,  在左侧工具栏中点右键  在出现的选项中点“Components”,在打开窗口中找到“Controls”选项也中的“Micr...
  • daiafei
  • daiafei
  • 2009年09月07日 11:41
  • 3053

VC2010 使用TAB控件

1. 添加TAB控件并
  • phenixyf
  • phenixyf
  • 2014年05月20日 18:05
  • 3822
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tab控件的使用
举报原因:
原因补充:

(最多只允许输入30个字)