在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应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的 ...
随机推荐
- spring 框架整合 笔记4
struts hibernate spring 先贴出框架整合需要的maven <project xmlns="http://maven.apache.org/POM/4.0.0&qu ...
- thinkphp 常用的查询
php 常用的数据库查询方式: //根据where 条件查询,使用select()方法 访问:http://localhost/thinkphp2/index.php/Machine/search_i ...
- android蓝牙(二)——接收数据
在蓝牙开发中,我们有这种一个需求:我们的androidclient要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,androidclient就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持an ...
- HDU 1862 EXCEL次序 (排序水问题)
Problem Description Excel对能够记录一组由任意列排序指定.现在,请把你编译的代码类似特征. Input 測试输入包括若干測试用例. 每一个測试用例的第1行包括两个整数 N ...
- IOS 时间格式 时间转换 大总结
//实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatteralloc] init]; //设定时间格式,这里 ...
- windows 不能在 本地计算机 启动 Apache
可能是Apache 的监听端口与其他软件有冲突,这是新手常犯的一个错误,Windows安装了IIS服务器的同时,又安装Apache服务器,二个服务器软件都监听TCP/IP协议的80端口,于是就有其中的 ...
- libev源代码浅析
libev是一个开源的事件驱动库,基于epoll,kqueue等OS提供的基础设施.其以高效出名,它可以将IO事件,定时器,和信号统一起来,统一放在事件处理这一套框架下处理. libev的基本使用方法 ...
- win32下利用python操作printer
在win32下操作printer: 1)import win32print 2) 获得默认打印机名: >>> win32print.GetDefaultPr ...
- jquery.zclip—复制剪贴板(兼容各大浏览器)
开始前说两句 WEB开发中,要让用户复制页面中的一段代码.URL地址等信息,为了避免用户拖动鼠标再进行右键复制操作而可能出现的差错,我们可以直接在页面中放置一个复制按钮,只需要轻轻一点这个复制按钮,内 ...
- AzureDev 社区活动获奖者公布
今天,我们高兴地宣布 AzureDev社区活动的获奖者,并向这 5 个非盈利技术教育组织发放 10 万美元奖金.在 2013 年的Build大会上宣布的 AzureDev 活动专注于通过代码改变世界, ...