Tab控件的使用(二)

2023-05-16

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

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

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

+ expand sourceview plaincopy to clipboardprint?
class CTabPage : public CTabCtrl  
 
    DECLARE_DYNAMIC(CTabPage)  
 
    int     m_nPageCount;   //页数  
 
public:  
    CTabPage();  
    virtual ~CTabPage();  
 
    void    AddPage(CWnd* pPageWnd, LPTSTR lpTitle);    //添加选项卡  
    void    ShowCurPage(UINT nShowState);               //显示当前页面  
 
public:  
    afx_msg void OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult);  
    afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);  
 
    DECLARE_MESSAGE_MAP()  
}; 
class CTabPage : public CTabCtrl
{
 DECLARE_DYNAMIC(CTabPage)

 int  m_nPageCount; //页数

public:
 CTabPage();
 virtual ~CTabPage();

 void AddPage(CWnd* pPageWnd, LPTSTR lpTitle); //添加选项卡
 void ShowCurPage(UINT nShowState);    //显示当前页面

public:
 afx_msg void OnTcnSelchanging(NMHDR *pNMHDR, LRESULT *pResult);
 afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult);

 DECLARE_MESSAGE_MAP()
};

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

+ expand sourceview plaincopy to clipboardprint?
typedef struct tagTCITEMW  
 
    UINT mask; 
#if (_WIN32_IE >= 0x0300)  
    DWORD dwState;  
    DWORD dwStateMask; 
#else  
    UINT lpReserved1;  
    UINT lpReserved2; 
#endif  
    LPWSTR pszText;  
    int cchTextMax;  
    int iImage;  
 
    LPARAM lParam;  
} TCITEMW, *LPTCITEMW; 
typedef struct tagTCITEMW
{
    UINT mask;
#if (_WIN32_IE >= 0x0300)
    DWORD dwState;
    DWORD dwStateMask;
#else
    UINT lpReserved1;
    UINT lpReserved2;
#endif
    LPWSTR pszText;
    int cchTextMax;
    int iImage;

    LPARAM lParam;
} TCITEMW, *LPTCITEMW;

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

+ expand sourceview plaincopy to clipboardprint?
void CTabPage::AddPage(CWnd *pPageWnd, LPTSTR lpTitle)  
 
    TCITEM  itemPage;  
 
    itemPage.mask       = TCIF_TEXT|TCIF_PARAM;  
    itemPage.lParam     = LPARAM(pPageWnd);  
    itemPage.pszText    = lpTitle;  
 
    InsertItem(m_nPageCount, &itemPage);  

   
m_nPageCount==0?pPageWnd->ShowWindow(SW_SHOW):pPageWnd->ShowWindow(SW_HIDE);  

   
m_nPageCount++;  

 

 

void CTabPage::ShowCurPage(UINT
nShowState)  

 

   
int    
nCurItem;  

   
TCITEM 
itemCur;  

 

   
nCurItem       
= GetCurSel();  

   
itemCur.mask   
= TCIF_PARAM;  

 

   
GetItem(nCurItem,
&itemCur);  

   
((CWnd*)itemCur.lParam)->ShowWindow(nShowState);  



void CTabPage::AddPage(CWnd *pPageWnd, LPTSTR lpTitle)

{

 TCITEM itemPage;

 itemPage.mask  = TCIF_TEXT|TCIF_PARAM;
 itemPage.lParam  = LPARAM(pPageWnd);
 itemPage.pszText = lpTitle;

 InsertItem(m_nPageCount, &itemPage);
 m_nPageCount==0?pPageWnd->ShowWindow(SW_SHOW):pPageWnd->ShowWindow(SW_HIDE);

 m_nPageCount++;

}

void CTabPage::ShowCurPage(UINT nShowState)
{
 int  nCurItem;

 TCITEM itemCur;

 nCurItem  = GetCurSel();
 itemCur.mask = TCIF_PARAM;

 GetItem(nCurItem, &itemCur);
 ((CWnd*)itemCur.lParam)->ShowWindow(nShowState);

}

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

     

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tab控件的使用(二) 的相关文章

  • ViewPage+RadioGroup实现Tab切换

    以前写过一篇也是Tab切换的文章 xff0c 当时做安卓一年左右 xff0c 单纯觉得这样能实现功能 xff0c 但是没有注意到性能和代码简洁性的问题 xff0c 文章为 http blog csdn net nzzl54 article
  • Visual Studio 中 Tab 转换为空格的设置

    在 Visual Studio 中写代码时 xff0c 按 Tab 键 xff0c 会自动进行缩进 有时希望实现按 Tab 键 xff0c 出现多个空格的效果 Visual Studio 提供了这样的功能 xff0c 具体设置方法为 xff
  • Notepad++ 中 tab 转 空格

    目录 一 引言 二 tab转空格 一 引言 为了便于观看 xff0c 以及防止程序出bug xff0c 一般不用tab键 xff0c 而是用4个空格代替 因为tab键在不同的软件里代表不同的空格 xff0c 有的代表4个空格 xff0c 有
  • 批量替换tab为空格

    利用find 找出需要替换的文件 xff0c 然后使用sed命令执行替换 如将src 路径下的所有cpp 文件的tab 替换为空格的命令如下 sed span class hljs attribute i span span class h
  • 20230401在win10下复制粘贴python代码的问题【TAB惹的祸】

    20230401在win10下复制粘贴python代码的问题 TAB惹的祸 2023 4 1 16 07 习惯使用TAB按键而不是4个空格来分割代码块 xff01 在WIN7下调通的python代码 xff0c 生成一个使用ffmpeg来合
  • 将linux文件中的tab更换为空格的三种方法

    将linux文件中的tab更换为空格的三种方法 1 xff0c 用sed命令 sed s t g filename gt filename1 2 用tr命令 cat filename tr 34 t 34 34 34 gt filename
  • Linux远程界面中Tab键不能补全

    我们在使用嵌入式Linux板子的时候 xff0c 时常需要使用到远程界面 xff0c 可以通过本地电脑对板子进行操作 xff0c 显得相对便捷 在远程界面的使用中 xff0c 不可避免地要在终端进行命令输入 xff0c 这时可能出现Tab键
  • C语言:二维数组的使用及水平制表符(tab)

    题目 xff1a 编写一个计算从0 10各个数的平方和立方的程序 xff0c 并使用水平制表符 xff08 tab xff09 打印下表 要点一 xff1a 二维数组的应用 int a 11 3 定义了一个11 3 xff0c 即11行3列
  • 解决 debian TAB 键不能自动补全命令的原因

    weixin 33928137 2015 04 23 10 46 00 512 收藏 文章标签 xff1a 操作系统 版权 预约直播 xff1a 9月9日 12日 xff0c 携手众开源社区 xff0c 开发者们的年度盛会 开源大咖与开发者
  • HTML中的空格、Tab、书名号大于号以及常用特殊符号

    HTML字符实体 在HTML页面中 xff0c 有一些特殊的符号我们想使用 xff0c 但是呢又不方便直接使用 xff0c 那么我们就可以用一些实体名称来代替 注 xff1a 实体名称对大小写敏感 特殊字符描述实体名称 空格 空格 amp
  • 软件测试tab键是必须实现的吗,C++ Tab键实现自动补全输入功能

    include include include include usingnamespacestd include include include tab键获取相关值 xff0c 并打印到屏幕上 voidtab find char std
  • FastAdmin 自定义动态tab

    比如有两个表 A表 B表 xff08 B表里面有A的ID xff09 tab显示的是A表的内容 不同的tab有不同的数据 查询tab动态数据 span class token comment 查询tab数据 span span class
  • Linux解决Tab键无法自动补全

    Linux解决Tab键无法自动补全的问题 安装bash completion包 这个包提供Tab键自动补全功能 yum install span class token operator span y bash span class tok
  • QT5 QTabWidget 隐藏Tab 或 显示Tab 正确的解决方案

    前言 xff1a 因为业务原因 xff0c 需要根据场景动态隐藏某个tab和显示某个tab xff0c 本着能不动手就不动手的原则我翻遍各大搜索引擎看到大部分人给出的解决方案的只是草草的说隐藏的时候remove xff0c 显示的时候再加回
  • Tab控件的使用(二)

    tab控件其实只是提供了一组标签按钮 xff0c 其相互切换有响应的消息 xff0c 而且实现了对这些按钮管理的功能 至于通过这些标签按钮来管理我们自己的界面那就要我们通过其提供的各种方法自己实现了 xff0c 这一方面减轻了tab控件自身
  • Tab栏选项卡JS交互效果~JS

    tab栏选项卡 tab栏选项卡 分析 xff1a 分两个部分上面是选项卡下面是点击选项卡后显示出来的一部分 xff1b h5c3制作时将下面部分的样式利用display xff1a none xff1b 全部隐藏起来 JS中对于选项卡制作依
  • JS中~ 面向对象编程制作tab栏

    面向对象编程制作tab栏 利用constructor属性接收实例对象传递过来的参数去获取和htm结构中的元素 xff0c 在类函数中对各种不同的功能封装成不同的函数 xff0c 在制作过程中相互调用 xff0c 第一步的点击上边按钮与此同时
  • layui date控件的使用

    最近项目多用layui xff0c 就总结一下 span class token tag span class token tag span class token punctuation lt span div span span cla
  • Sublime Text 3 tab快捷键失效解决办法

    快速搭建html框架快捷键 tab发现失效 查资料发现缺少Emmet插件 解决办法如下 1 Ctrl Shift P 搜索package control install 2 按下回车搜索emmet 3 安装emmet 4 安装完成后可通过P
  • element-ui中el-tab的的使用

    element ui中el tab的的使用 el tab在页面中当作tab页使用如下 name就是与选项卡绑定值 value 对应的标识符 表示选项卡别名 用v model绑定值 选中选项卡的 name label 设置选项卡的标题 可以动

随机推荐

  • C语言中‘a‘和“a“有什么区别?

    1 本质区别 双引号里面的是字符串 xff0c 而单引号里面的代表字符 2 输出区别 str 61 a 输出的就是a这个字母 xff1b str 61 a 输出的测试65 3 底层区别 用单引号引起的一个字符实际上代表一个整数 xff0c
  • linux VNC客户端登陆失败

    vnc登陆出现 Unknown authentication scheme from VNC server 解决办法 xff08 建议在做操作之前重启vnc server xff0c 密码输错过多可能导致一直连接失败 xff09 https
  • win 10 mstsc连接 RemoteApp

    本文是关于mstsc客户端的配置 xff08 服务端的配置本文不描述 xff09 xff0c 前提是服务端配好 xff0c 知道RemoteApp怎么玩的 windows 2008 的mstsc有个配置 xff0c 关于程序 的tab页 但
  • 贪心算法的改进

    关于贪心算法 xff0c 请看我的上一篇博客 解决贪心算法的复杂度 为解决贪心算法的复杂度 本文提出 xff1a 通过分解极大联通子图去寻找影响力最大的节点的算法 强连通 xff1a 在有向图G中 xff0c 如果任意两个不同的顶点相互可达
  • 非关系型数据库-redis应用场景

    关系型数据库与非关系型数据库 redis的应用场景 xff1a 1 redis由于数据的读取和操作都在内存当中操作 xff0c 读写的效率较高 xff0c 所以经常被用来做数据的缓存 把一些需要频繁访问的数据 xff0c 而且在短时间之内不
  • Linux创建用户后,登录报错/usr/bin/xauth: file /home/user/.Xauthority does not exist

    错误信息如下 usr bin xauth span class token function file span home user Xauthority does not exist 错误原因 是因为添加用户时没有授权对应的目录 xff0
  • VSCode测试ES6语法

    一 VsCode使用 1 1 VsCode基本操作 Alt 43 Shift 43 F格式化代码 二 ES6新特性 2 1 let声明常量 2 2 const声明常量 只读变量 2 3 解析表达式 2 3 1 数组解构 2 3 2 对象解构
  • VNC远程连接树莓派报错问题解决(文末有惊喜呦)

    用VNC远程连接树莓派 xff0c 出现拒绝连接 问题原因 xff1a 只设置了PC端的服务器 xff0c 但是没有在树莓派端开端口 解决办法 xff1a 用putty或者xshell连接树莓派 xff0c 输入命令 xff1a vncse
  • ReadFile函数

    函数功能 xff1a 该函数从文件指针指示的位置开始从文件读数据 xff0c 在读操作完成后 xff0c 如果文件句柄不是用重叠属性来创建 xff0c 则文件指针用实际读的字数来调整 如果文件句柄为重叠的输入和输出 xff08 I O xf
  • error MSB8041: 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。

    最近新安装了vs2019企业版 xff0c 用vs打开vs2015的工程出现如下错误 xff1a error MSB8041 此项目需要 MFC 库 从 Visual Studio 安装程序 单个组件选项卡 为正在使用的任何工具集和体系结构
  • PC和Android模拟器之间虚拟串口通信

    前言 很多时候我们在做串口通信的时候需要去模拟串口来调试 xff0c 这样可以极大的方便我们的工作 xff0c 不然的话可能需要连接硬件设备 xff0c 比较麻烦 一般情况下我们先在电脑上模拟串口后初步调试 xff0c 最后阶段在硬件设备上
  • 【C语言】将正数转成负数,将负数转成正数

    将正数转成负数 xff0c 将负数转成正数 include lt stdio h gt int change int num if num lt 0 num 61 num 1 else if num gt 0 num 61 num 43 1
  • C语言中的输入输出流和缓冲区(重点)详解

    导读 xff1a C语言中我们用到的最频繁的输入输出方式就是scanf 与printf scanf xff1a 从标准输入设备 键盘 读取数据 xff0c 并将值存放在变量中 printf xff1a 将指定的文字 字符串输出到标准输出设备
  • MFC下按钮自绘的实现

    MFC下按钮自绘的实现 MFC下按钮自绘的实现 xff08 一 xff09 在MFC下编程 xff0c 很多时候对于标准的按钮控件不是很满意 xff0c 想要弄的美观点 这就需要按钮自绘 这里简单记录一下方法 xff0c 以免过个十天半个月
  • Invalidaterect()函数的作用详细解释

    函数原型 xff1a BOOLInvalidateRect HWND hWnd handle of window withchanged update region 窗口句柄 CONST RECT lpRect address ofrect
  • 【Python小白学习——错误解决3】RuntimeWarning: More than 20 figures have been opened

    待解决的问题 xff1a RuntimeWarning More than 20 figures have been opened Figures created through the pyplot interface 96 matplo
  • ffmpeg修改视频文件的分辨率

    在本文中 xff0c 我们将展示如何调整任何视频文件的大小 这种方法是在Linux系统 xff08 几乎任何发行版 xff09 中调整视频文件大小的最佳方法之一 xff0c 也是Windows和Mac用户的绝佳替代方案 更改视频文件的分辨率
  • SQLServer安装教程(史上最详细版本)

    下载 安装包已上传至百度网盘 xff0c 安装包里已含注册码 xff0c 下载地址 xff08 含注册码 xff09 链接 xff1a https pan baidu com s 147YRI7DdCqTOTKfe9UNtiA 提取码 xf
  • 通过 GetFileVersionInfo 获取EXE 或 DLL的各种资源

    查找网上资源甚多 xff0c 但无一个代码能用 xff0c 甚憾 自已阅读MSDN资料 xff0c 终于写得下面代码 xff0c 经测试通过 xff0c 若有问题请发邮件给我 xff0c 谢谢 xff01 struct LANGANDCOD
  • Tab控件的使用(二)

    tab控件其实只是提供了一组标签按钮 xff0c 其相互切换有响应的消息 xff0c 而且实现了对这些按钮管理的功能 至于通过这些标签按钮来管理我们自己的界面那就要我们通过其提供的各种方法自己实现了 xff0c 这一方面减轻了tab控件自身