当前位置: 首页 > 编程日记 > 正文

鸡啄米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++代码
  1. BOOL CExample33Dlg::OnInitDialog()   
  2. {   
  3.     CDialogEx::OnInitDialog();   
  4.   
  5.     // Add "About..." menu item to system menu.   
  6.   
  7.     // IDM_ABOUTBOX must be in the system command range.   
  8.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  9.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  10.   
  11.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  12.     if (pSysMenu != NULL)   
  13.     {   
  14.         BOOL bNameValid;   
  15.         CString strAboutMenu;   
  16.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
  17.         ASSERT(bNameValid);   
  18.         if (!strAboutMenu.IsEmpty())   
  19.         {   
  20.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  21.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  22.         }   
  23.     }   
  24.   
  25.     // Set the icon for this dialog.  The framework does this automatically   
  26.     //  when the application's main window is not a dialog   
  27.     SetIcon(m_hIcon, TRUE);         // Set big icon   
  28.     SetIcon(m_hIcon, FALSE);        // Set small icon   
  29.   
  30.     // TODO: Add extra initialization here   
  31.     CRect tabRect;   // 标签控件客户区的位置和大小   
  32.   
  33.     m_tab.InsertItem(0, _T("鸡啄米"));         // 插入第一个标签“鸡啄米”  
  34.     m_tab.InsertItem(1, _T("Android开发网"));  // 插入第二个标签“Android开发网”   
  35.     m_jzmDlg.Create(IDD_JIZHUOMI_DIALOG, &m_tab);    // 创建第一个标签页   
  36.     m_androidDlg.Create(IDD_ANDROID_DIALOG, &m_tab); // 创建第二个标签页   
  37.   
  38.     m_tab.GetClientRect(&tabRect);    // 获取标签控件客户区Rect   
  39.     // 调整tabRect,使其覆盖范围适合放置标签页   
  40.     tabRect.left += 1;                  
  41.     tabRect.right -= 1;   
  42.     tabRect.top += 25;   
  43.     tabRect.bottom -= 1;   
  44.     // 根据调整好的tabRect放置m_jzmDlg子对话框,并设置为显示   
  45.     m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);   
  46.     // 根据调整好的tabRect放置m_androidDlg子对话框,并设置为隐藏   
  47.     m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);   
  48.   
  49.     return TRUE;  // return TRUE  unless you set the focus to a control   
  50. }  

6. 运行程序,查看结果,这时我们发现切换标签时,标签页并不跟着切换,而总是显示CJzmDlg对话框。

7. 我们要实现的是标签页的切换效果,所以还要为m_tab标签控件的通知消息TCN_SELCHANGE添加处理函数,并修改如下:

C++代码
  1. void CExample33Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)   
  2. {   
  3.     // TODO: Add your control notification handler code here   
  4.     *pResult = 0;   
  5.     CRect tabRect;    // 标签控件客户区的Rect   
  6.   
  7.     // 获取标签控件客户区Rect,并对其调整,以适合放置标签页   
  8.     m_tab.GetClientRect(&tabRect);   
  9.     tabRect.left += 1;   
  10.     tabRect.right -= 1;   
  11.     tabRect.top += 25;   
  12.     tabRect.bottom -= 1;   
  13.   
  14.     switch (m_tab.GetCurSel())   
  15.     {   
  16.     // 如果标签控件当前选择标签为“鸡啄米”,则显示m_jzmDlg对话框,隐藏m_androidDlg对话框   
  17.     case 0:   
  18.         m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);   
  19.         m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);   
  20.         break;   
  21.     // 如果标签控件当前选择标签为“Android开发网”,则隐藏m_jzmDlg对话框,显示m_androidDlg对话框   
  22.     case 1:   
  23.         m_jzmDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW);   
  24.         m_androidDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW);   
  25.         break;   
  26.     default:   
  27.         break;   
  28.     }   
  29. }  

8. 再运行程序,最终的标签页切换效果如下面两图:

标签控件第一个标签页

标签页第二个标签页

经过两讲内容,终于把标签控件的主要知识讲完了。如果想了解更多的相关内容,可以查看MSDN。鸡啄米最后还是谢谢各位的关注和支持。


转载地址:http://www.jizhuomi.com/software/207.html

转载于:https://www.cnblogs.com/zfluo/p/5131893.html

相关文章:

Java项目:网上图书商城系统(java+SSM+Jsp+MySQL+Redis+JWT+Shiro+RabbitMQ+EasyUI)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 这个项目涉及到Shiro整合JWT、秒杀功能所具备的基本要求(限流、乐观锁、接口隐藏、JMeter高并发测试等等)、消息中间件RabbitMQ的异步邮件通知和死信队列、沙箱支付宝模拟支付等等技术亮点。 项目功能&#…

虚拟机使用镜像文件安装系统

场景说明&#xff1a;指定Linux镜像之后&#xff0c;点击电源开始安装&#xff0c;安装完成之后&#xff0c;卸载ISO&#xff0c;进入BIOS&#xff0c;设置从硬盘启动。vmvare有提供快速安装的方式。当前的安装类似于手动安装&#xff0c;模拟真实的环境操作步骤&#xff1a;1&…

cmd命令简单别木马的蛛丝马迹

一些基本的Windows命令往往可以识别木马的蛛丝马迹&#xff0c;而且在保护网络安全上起到很大的作用。 检测网络连接 如果你怀疑自己的计算机上被别人安装了木马&#xff0c;或者是中了病毒&#xff0c;但是手里没有完善的工具来检测是不是真有这样的事情发生&#xff0c;那可以…

ubuntu常用翻译工具stardict

日常办公应用中&#xff0c;我们经常会碰到一些陌生的外文单词或文章需要翻译&#xff0c;在Windows平台上&#xff0c;可通过很多翻译工具来帮忙解决。当我们转到Ubuntu系统 中办公时&#xff0c;肯定也希望能有一款简单易用、功能强大的翻译工具。   这里给大家推荐Linux平…

Java项目:教务管理系统(java+JSP+Spring+SpringBoot+layui+maven)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能包括&#xff1a; 三角色教师 管理员&#xff0c;学生教务管理系统&#xff0c;包括院系管理&#xff0c;课题综合管理&#xff0c;信息管理&#xff0c;以及差旅管理&#xff0c;学生选题…

jsp 环境配置记录

1. jdk&#xff0c;下载地址1 环境变量配置&#xff1a; 1&#xff09;新建 JAVA_HOME 变量 。 变量值填写jdk的安装目录&#xff08;本人是 C:\Java\jdk1.7.0) 2) 系统变量→寻找 Path 变量→编辑 在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; &#xff08;注意原…

一些关于找工作的书籍

技术类 算法导论&#xff1a;不要纠缠太难的部分&#xff08;红黑树、斐波那契额堆、NP、近似算法&#xff09;&#xff1b; 编程之美&#xff1a;仔细阅读&#xff0c;包括上面的智力题&#xff0c;纸上手写代码&#xff1b; 编程珠玑&#xff1a;建议仔细阅读&#xff0c;尤其…

最快地复制一张表

1.mysqldump方法 一种方法是&#xff0c;使用mysqldump命令将数据导出成一组INSERT语句。你可以使用下面的命令&#xff1a; mysqldump -h$host -P$port -u$user --add-locks --no-create-info --single-transaction --set-gtid-purgedOFF db1 t --where"a>900" …

Linux下C++开发工具介绍

概述 就C&#xff0b;&#xff0b;开发工具而言&#xff0c;与Windows下微软&#xff08;VC&#xff0c; VS2005等&#xff09;一统天下相比&#xff0c;Linux/Unix下C&#xff0b;&#xff0b;开发&#xff0c;可谓五花八门&#xff0c;各式各样。Emacs, vi, eclipse, anj…

Linked List Cycle II

Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Follow up:Can you solve it without using extra space? 分析&#xff1a;和Linked List Cycle类似&#xff0c;还是用map。 用时&#xff1a;60ms 1 /**2 * Definition …

Java项目:考试管理系统(java+Springboot+Maven+Jpa+Vue+Mysql)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述本系统功能包括&#xff1a; 支持单选题、多选题、判断题支持学生(student)、教师(teacher)、管理员(admin)三种角色学生&#xff1a;参加考试和查看我的考试教师&#xff1a;学生的所有权限创建…

[物理学与PDEs]第1章第7节 媒质中的 Maxwell 方程组 7.2 媒质交界面上的条件

通过 Maxwell 方程组的积分形式易在交界面上各量应满足交界面条件: $$\beex \bea \sez{{\bf D}}\cdot{\bf n}\omega_f,&\sex{\omega_f:\ \mbox{交界面上自由电荷密度}};\\ \sez{{\bf B}}\cdot{\bf n}0,&\sex{\ra\mbox{ 磁感应强度法向分量在交界面上连续}};\\ \sez{{\b…

第十二周编程总结

这个作业属于的课程C语言程序设计2这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/MS/homework/3239我在这个课程的目标是使用编程实现简单的游戏设计这个作业在哪个具体方面帮助我实现目标使用指针解决问题&#xff0c;熟悉指针与函数之间的关系和指针作为函数返回值…

什么是交叉编译

在一种计算机环境中运行的编译程序&#xff0c;能编译出在另外一种环境下运行的代码&#xff0c;我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说&#xff0c;就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台&#xff0c;实际上…

树形结构在关系数据库中的设计

在程序设计中&#xff0c;经常以树形结构表示数据的层次关系&#xff0c;如菜单的结构、商品的分类等。 这样的层次结构在关系数据库中难以直观地表示。常见的一种做法是用一个字段指向上级节点来表示记录的上下级关系。 fidpidfname 1 Food 2 1 Fruit 3 2 Red 4 3…

Java项目:在线课程会员系统(java+Springboot+Maven+JSP+Spring+Mysql+layui)

一、项目简述 功能包括&#xff1a; 用户管理&#xff0c;课程管理&#xff0c;在线视频观看&#xff0c;评论&#xff0c;会员展示&#xff0c;会员充值等等。 二、项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 mysql Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEc…

职场观察:高薪需要什么?

标签&#xff1a;职场高薪原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://xjsunjie.blog.51cto.com/999372/1378547新的一年&#xff0c;看到别人跳槽或涨薪&#xff0c;你是否也蠢蠢欲动…

Excel-姓名列中同一个人汇总金额列,得出总金额

8、姓名列中同一个人求和金额列&#xff0c;得出总金额。 方法一&#xff1a; P2处公式SUMPRODUCT(($M$2:$M$20$M2)*($N$2:$N$20)) 解释函数&#xff1a; 引用&#xff1a;https://zhinan.sogou.com/guide/detail/?id1610011625 PS&#xff1a;这个只是单条件求和&#xff0c;…

C语言编译全过程(转贴)

C语言编译全过程 编译的概念&#xff1a;编译程序读取源程序&#xff08;字符流&#xff09;&#xff0c;对之进行词法和语法的分析&#xff0c;将高级语言指令转换为功能等效的汇编代码&#xff0c;再由汇编程序转换为机器语言&#xff0c;并且按照操作系统对可执行文件…

Java项目:家教管理系统(java+SSM+MyBatis+MySQL+Maven+Jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 该系统分为前台和后台 前台功能有&#xff1a;登录、注册、查看学员、查看教师、个人中心等。 后台功能有&#xff1a;用户管理、学员管理、教师管理、审核管理、公告管理、新闻管理、简历管理等。前台注册…

ecshop /api/client/api.php、/api/client/includes/lib_api.php SQL Injection Vul

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 ECShop存在一个盲注漏洞&#xff0c;问题存在于/api/client/api.php文件中&#xff0c;提交特制的恶意POST请求可进行SQL注入攻击&#xff0c;可获得敏感信息或操作…

C++ 检测内存泄露

本文描述了如何检测内存泄露。最主要的是纯C&#xff0c;C的程序如何检测内存泄露。 现在有很多专业的检测工具&#xff0c;比如比较有名的BoundsCheck, 但是这类工具也有他的缺点&#xff0c;我认为首先BoundsCheck是商业软件&#xff0c;呵呵。然后呢需要安装&#xff0c;使用…

Java 学习笔记(4)——java 常见类

上次提前说了java中的面向对象&#xff0c;主要是为了使用这些常见类做打算&#xff0c;毕竟Java中一切都是对象&#xff0c;要使用一些系统提供的功能必须得通过类对象调用方法。其实Java相比于C来说强大的另一个原因是Java中提供了大量可用的标准库 字符串 字符串可以说是任何…

浅谈GCC预编译头技术

浅谈GCC预编译头技术 文/jorge ——谨以此文&#xff0c;悼念我等待MinGW编译时逝去的那些时间。 其 实刚开始编程的时候&#xff0c;我是丝毫不重视编译速度之类的问题的&#xff0c;原因很简单&#xff0c;因为那时我用BASICA。后来一直用到C Builder&#xff0c;尽管Borl…

Java项目:慢病报销管理信息系统(java+MySQL+Jdbc+Servlet+Jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 功能&#xff1a; 慢病管理&#xff0c;医疗机构管理&#xff0c;家庭管理&#xff0c;费用交纳&#xff0c;费用报销&#xff0c;报表统计等等功能。 二、项目运行 环境配置&#xff1a; Jd…

Jetty Cross Origin Filter解决jQuery Ajax跨域访问的方法

当使用jQuery Ajax post请求时可能会遇到类似这样的错误提示 XMLHttpRequest cannot load http://xxxxxx. Origin http://xxxxxx is not allowed by Access-Control-Allow-Origin. 这是Ajax跨域访问权限的问题&#xff0c;服务器端不接受来自另一个不同IP地址的由脚本文件发出的…

php 遍历所有的文件

<?php prin_r(glob($path)); 2 转载于:https://www.cnblogs.com/zqk8553/p/3640071.html

Oracle数据库物理存储结构管理

1、实验目的 &#xff08;1&#xff09;掌握Oracle数据库数据文件的管理。 &#xff08;2&#xff09;掌握Oracle数据库控制文件的管理。 &#xff08;3&#xff09;掌握Oracle数据库重做日志文件的管理。 &#xff08;4&#xff09;掌握Oracle数据库归档管理。 2、实验环境 Wi…

KDE与GNOME的战争史(转载)

虽然在商业方面存在竞争&#xff0c;GNOME与KDE两大阵营的开发者关系并没有变得更糟&#xff0c;相反他们都意识到支持对方的重要性—如果KDE和GNOME无法实现应用程序的共享&#xff0c;那不仅是巨大的资源浪费&#xff0c;而且将导致Linux出现根本上的分裂。 KDE与GNOME是…

[ActionScript 3.0] AS向php发送二进制数据方法之——在URLRequest中构造HTTP协议发送数据...

主类 HTTPSendPHP.as 1 package 2 {3 import com.JPEGEncoder.JPGEncoder;4 import com.fylib.httpRequest.HttpRequestBuilder;5 import com.fylib.httpRequest.HttpRequestBuilderConsts;6 import flash.display.Bitmap;7 import flash.display.BitmapDa…