在VC++中使用Tab Control控件
系统环境:Windows 7
软件环境:Visual Studio 2008 SP1
本次目的:在模态或非模态对话框中使用Tab Control控件,及引申在单/多文档中使用
查阅MSDN文档,对于创建Tab Control控件,MSDN上说明如下:
To use CTabCtrl directly in a dialog box
1. In the dialog editor, add a Tab Control to your dialog template resource. Specify its control ID.
2. Use the Add Member Variable Wizard to add a member variable of type CTabCtrl with the Control property. You can use this member to call CTabCtrl member functions.
3. Map handler functions in the dialog class for any tab control notification messages you need to handle. For more information, see Mapping Messages to Functions.
4. In OnInitDialog, set the styles for the CTabCtrl .
To use CTabCtrl in a nondialog window
1. Define the control in the view or window class.
2. Call the control's Create member function, possibly in OnInitialUpdate, possibly as early as the parent window's OnCreate handler function (if you're subclassing the control). Set the styles for the control.
对于直接使用 CTabCtrl 在对话框内
1. 在对话框编辑区内,添加一个 Tab Control 控件到资源模板里面,设置它的控制 ID
2. 使用添加成员变量向导,为控件添加一个 CTabCtrl 类型的成员变量,你可以使用这个变量调用 CTabCtrl 的成员函数
3. 对话框类的映射处理功能可以处理任何你需要处理的标签控件消息。有关更多信息,请参阅消息映射函数。
4. 在 OnInitDialog() 函数里面,设置 CTabCtrl 的风格。
对于在非对话框窗口使用 CTabCtrl
1. 定义在视图或窗口类的控件。
2. 调用控件的创建成员函数,可能在 OnInitialUpdate 中,可能在父窗口的 OnCreate 处理函数早期(如果你是子类的控件)。设置控件的风格。
下面介绍在对话框中添加 Tab Control 控件,工程不一定是要 MFC 基于对话框形式,单文档视图类派生自 CFormView 的工程也行,或是任何工程弹出的对话框 ( 如登录界面等等 ) 都行 ( 个人没有都去实验,但理论上应该可以,看了下面就知道。 )
1. 首先在对话框资源上添加一个 Tab Control 控件 ID 为 IDC_LOGIN_TAB ,根据需要修改其属性,然后为其添加成员变量 m_tab ,类型为 CTabCtrl
2. 需要几个选项卡,则在对话框资源添加几个对话框,在这里我添加两个选项卡,则要添加两个对话框,其 ID 分别为 IDD_TAB1_DIALOG , IDD_TAB2_DIALOG 它们的属性 style 为 Child, Border 为 None ,其他的再根据自己调整。然后分别为其添加对应的基于 CDialog 类 CLoginTab1 , CLoginTab2
3. 在主对话框添加子对话框头文件,然后再添加三个成员变量,为子对话框添加实例。在 OnInitDialog() 函数初始化 Tab Control 控件显示,若对话框没有 OnInitDialog() 函数,则重载这个函数,具体如下:
- //主对话框头文件
- class LoginUser : public CDialog
- {•••
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
- virtual BOOL OnInitDialog(); //没有这个,则在这里重载
- DECLARE_MESSAGE_MAP()
- public:
- CTabCtrl m_tab;
- CLoginTab1 m_login_tab1;
- CLoginTab2 m_login_tab2;
- •••
- }
- //主对话框实现文件
- BOOL LoginUser::OnInitDialog()
- {
- CDialog::OnInitDialog();
- m_tab.InsertItem(0,_T("系统登录"));
- m_tab.InsertItem(1,_T("服务器设置"));
- m_login_tab1.Create(IDD_TAB1_DIALOG,GetDlgItem(IDC_LOGIN_TAB));
- m_login_tab2.Create(IDD_TAB2_DIALOG,GetDlgItem(IDC_LOGIN_TAB));
- //获得IDC_TABTEST客户区大小
- CRect rs;
- m_tab.GetClientRect(&rs);
- //调整子对话框在父窗口中的位置,根据实际修改
- rs.top+=25;
- rs.bottom-=60;
- rs.left+=1;
- rs.right-=10;
- //设置子对话框尺寸并移动到指定位置
- m_login_tab1.MoveWindow(&rs);
- m_login_tab2.MoveWindow(&rs);
- //分别设置隐藏和显示
- m_login_tab1.ShowWindow(true);
- m_login_tab2.ShowWindow(false);
- //设置默认的选项卡
- m_tab.SetCurSel(0);
- return TRUE;
- }
4. 响应选项卡切换事件消息,右键 Tab Control 控件,添加事件处理程序,选择 TCN_SELCHANGE 事件,在弹出的编辑区域,填入以下代码:
- void LoginUser::OnTcnSelchangeLoginTab(NMHDR *pNMHDR, LRESULT *pResult)
- {
- // TODO: 在此添加控件通知处理程序代码
- int CurSel = m_tab.GetCurSel();
- switch(CurSel)
- {
- case 0:
- m_login_tab1.ShowWindow(true);
- m_login_tab2.ShowWindow(false);
- break;
- case 1:
- m_login_tab1.ShowWindow(false);
- m_login_tab2.ShowWindow(true);
- break;
- default: ;
- }
- *pResult = 0;
- }
5. 编译运行。
接下来,来看看非模态对话框的实现,因为Tab Control控件要在对话框的OnInitDialog () 函数初始化,而MSDN上说:
After the dialog box and all of its controls are created but just before the dialog box (of either type) appears on the screen, the dialog object's OnInitDialog member function is called. For a modal dialog box, this occurs during the DoModal call. For a modeless dialog box, OnInitDialog is called when Create is called. You typically override OnInitDialog to initialize the dialog box's controls, such as setting the initial text of an edit box. You must call the OnInitDialog member function of the base class, CDialog , from your OnInitDialog override.
非模态对话框是在Create的时候一起调用初始化函数的,OnInitDialog()我们仍可以重载这个函数,来实现以上功能。对于单文档/多文档可以看前面的MSDN说明,这里不再详细写。本文若有错误,请指出。
在VC++中使用Tab Control控件的更多相关文章
- 【MFC】Tab Control 控件的使用(转)
原文转自 http://blog.csdn.net/hustspy1990/article/details/5425365 1.先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control ...
- MFC编程 | tab control控件的使用
因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // tab control控件的使用 // 建立一个Cluster窗口,通过tab可以切换成C-Means和Fuzzy C- ...
- C++ MFC Tab Control控件的详细使用
1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置I ...
- 通过编写串口助手工具学习MFC过程——(七)添加Tab Control控件
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中
OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Co ...
- VC++6.0/MFC中如何限制Edit控件输入 例子,只能输入0和1
1.Insert -> New Class -> 在Base Class中选择CEdit,在Name中输入CMyEdit. 2.在左边的ClassView中,右键击CMyEdit,选择Ad ...
- 怎样在VS2013/MFC中使用TeeChart绘图控件
TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...
- WinForm/Silverlight多线程编程中如何更新UI控件的值
单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么 ...
- [转] c#中 多线程访问winform控件
原文 c#中多线程访问winform控件的若干问题小结 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的 ...
随机推荐
- 建房子之前先挖地基 - Java BlockingQueue理解
最近一直在看<Think In Java>里关于并发部分的章节,读到第二十一章有一个有趣的比喻:必须先挖房子的地基,但是接下来可以并行的铺设钢结构和构建水泥部件,而这两项任务必须在混凝土浇 ...
- Hdu 1301 Jungle Roads (最小生成树)
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1301 很明显,这是一道“赤裸裸”的最小生成树的问题: 我这里采用了Kruskal算法,当然用Prim算法也 ...
- 用newLISP读取Hive的元数据
思想是通过调用hive -e命令,然后解析返回的结果. 以下的hive.lsp文件是一个样例,提供了读取本地hive数据库名称.表名,表结构和依据hive表的创建语句生成相应的MySQL的创建语句. ...
- Android之drawable state各个属性具体解释
我们在定义一个drawable的时候能够通过xml定义的drawable对象.它使得一个图片能在不同的状态下显示不同的图案,比方一个Button,它有pressed.focused,或者其他状态,通过 ...
- CentOS中使用shell的命令补全
习惯debian的用户都知道shell中的自动补全功能非常实用,其中在CentOS中也可以有同样的功能. 只需要安装 bash-completion 包即可. rpm -ivh http://www. ...
- iOS中的图像处理(三)——混合运算
有时候,单独对一张图像进行处理是很难或者根本达不到我们想要的效果的.一个好的滤镜效果的诞生,往往要经过很多复杂步骤.细致微调.图片应用效果观察以及很多图层叠加. 我在JSWidget上发现了一些常用混 ...
- stm32之PWM
PWM是pulse width modulation的缩写,即脉冲宽度调制.其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形: 1.PWM是一种对模拟信号电平进行数字编码的方法.通过高分辨率计 ...
- c.Tom and paper
Tom and paper Description There is a piece of paper in front of Tom, its length and width are intege ...
- CoinChange
题目 题目:CoinChange 有面额不等的coins,数量无限,要求以最少的\(coins\)凑齐所需要的\(amount\). 若能,返回所需的最少coins的数量,若不能,返回-1. Exam ...
- 2013移动APP界面设计趋势与设计理念
用户是上帝,一切还得从应用说起.为此,国外著名的应用设计师Gannon Burgett结合自己多年实战经验归纳总结了2013年App设计发展的13大趋势.我们应该时刻记着这13点. 1.扁平化设计—— ...