如何优雅的写UI——(3)添加MFC选项卡
窗体创建完成,接下来我们讲讲控件的使用
首先在CFormView窗体下选项卡的成员变量,这里我选择MFC下的选项卡类库:CMFCTabCtrl
class CtabView : public CFormView
{
......
......
public:
CMFCTabCtrl m_tab; }
在初始化中动态创建选项卡并设置选项卡的样式,这里我们使用了Creat函数,他的原型是
BOOL Create(Style style, const RECT& rect, CWnd* pParentWnd, UINT nID, Location location = LOCATION_BOTTOM, BOOL bCloseBtn = FALSE);
第一个参数 Style style
是一个枚举类型,它定义了选项卡的样式,基本都为3D的样式
public:
CMFCTabCtrl();
enum Style
{
STYLE_3D = 0,
STYLE_FLAT = 1,
STYLE_FLAT_SHARED_HORZ_SCROLL = 2,
STYLE_3D_SCROLLED = 3,
STYLE_3D_ONENOTE = 4,
STYLE_3D_VS2005 = 5,
STYLE_3D_ROUNDED = 6,
STYLE_3D_ROUNDED_SCROLL = 7,
};
第二个参数:设置选项卡大小
第三个参数:窗体句柄
第四个参数:设置选项卡控件ID
第五个参数:设置选项卡标签位置,MFC只给了上下两个方向来显示选项卡标签的位置
public:
CMFCBaseTabCtrl();
enum Location
{
LOCATION_BOTTOM = 0,
LOCATION_TOP = 1
};
第六个参数:是否带关闭按钮,关闭按钮的逻辑是要自己实现的,这个我们下面再说。
添加选项卡代码:
void CtabView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit(); CRect rc;
GetClientRect(rc);
if (!m_tab.Create(CMFCTabCtrl::STYLE_3D_ONENOTE, rc, this, CMFCTabCtrl::RESIZE_HORIZ, CMFCTabCtrl::LOCATION_TOP))
{
return ;
}
}
创建好的选显卡是光秃秃的没有任何标签页的,这个需要我们手动添加

如何给选项卡创建标签页 ,这需要我们新建窗体在选项卡中显示
创建三个Dialog窗体备用

给窗体添加类,自动生成就可以

之后咱们给选项卡添加标签页,在选项卡中引用我们刚刚新建的Dialog类的指针
#include "Dialog1.h"
#include "Dialog2.h"
#include "Dialog3.h" class CtabView : public CFormView
{
public:
CMFCTabCtrl m_tab;
CDialog1 *m_dlg1;
CDialog2 *m_dlg2;
CDialog3 *m_dlg3; }
在程序初始化时动态创建的窗体
void CtabView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
CRect rc;
GetClientRect(rc);
if (!m_tab.Create(CMFCTabCtrl::STYLE_3D_ONENOTE, rc, this, 3000, CMFCTabCtrl::LOCATION_TOP,0))
{
return ;
}
m_dlg1=new CDialog1;
m_dlg2=new CDialog2;
m_dlg3=new CDialog3;
m_dlg1->Create(IDD_DIALOG1,&m_tab);
m_dlg1->SetFont(&afxGlobalData.fontRegular);
//m_dlg1->SetWindowTextW(L"Listctrl控件");
m_dlg2->Create(IDD_DIALOG2,&m_tab);
m_dlg2->SetFont(&afxGlobalData.fontBold);
//m_dlg2->SetWindowTextW(L"还没想好些什么控件");
m_dlg3->Create(IDD_DIALOG3,&m_tab);
m_dlg3->SetFont(&afxGlobalData.fontDefaultGUIBold);
/*m_dlg3->SetWindowTextW(L"还有什么控件比较难写吗");*/
m_tab.AddTab(m_dlg1,L"Listctrl控件");
m_tab.AddTab(m_dlg2,L"还没想好些什么控件");
m_tab.AddTab(m_dlg3,L"还有什么控件比较难写吗");
m_tab.EnableActiveTabCloseButton();//是否添加关闭选项卡按钮
m_tab.SetActiveTab(0); //激活选项卡,以当前选项卡为第一页。
}
运行一下看一下效果

看起来还可以,但是当我们点击标签页的时候会发现,我们的窗体是弹出式的并不是嵌入式,这是因为我门少了少了一步,导致窗体在创建的时候是以弹出的方式打开。

打开窗体属性,将Style属性由弹出Popup改为Child子窗口,所有的标签用的窗体都要这么改

效果

里面的窗体太难看了了,把边框和标题去掉就好了
窗体属性,把Border改为None就好了
最终效果

代码 添加MFC选项卡.zip
如何优雅的写UI——(3)添加MFC选项卡的更多相关文章
- 如何优雅的写UI——(4)选项卡美化
现在做出来的选项卡实在太丑的,咱们怎么把他弄得好看一点呢 tabctrl是可以添加icon图标的,那派生与tabctrl的mfctabctrl肯定也能添加图标,他们两个添加图标的原理一样,但是还是有点 ...
- 如何优雅的写UI——(5)选项卡功能实现
先在我们的选项卡可以说能用了,每个标签页都能点进去,但是这还远远没到能用的地步,比如说你把窗口最大化后. 立马就露出马脚了,所以这篇我们要先讲讲tabctrl的最基本的功能实现 改变选项卡大小 上图的 ...
- 如何优雅的写UI——(1)MFC六大核心机制-程序初始化
很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...
- 如何优雅的写UI——(2)MFC下基于CFormView的文档视图程序
在MFC中可以创建多种类型的窗口程序,如对话框程序.单文档结构程序(非文档/视图结构).单文档(文档/视图结构)以及多文档视图结构程序等. 在编写一般的小工具时,我们的首选显然是对话框程序,不过基于对 ...
- 如何优雅的写UI——(6)内存泄漏
控件讲了这么久,其实我的程序有两个Bug不知道大家有没有发现,这两个Bug都不会报错,对程序运行来说都没有阻碍,但是这种Bug对整个代码来说是一个很大的安全隐患. 什么是内存泄漏 内存泄漏(Memor ...
- 优雅的写好Vue项目代码 — 路由拆分、Vuex模块拆分、element按需加载
目录 路由的拆分 VUEX模块拆分 Element UI库按需加载的优雅写法 路由的拆分 项目较大路由较多时,路由拆分是一个不错的代码优化方案,按不同业务分为多个模块,结构清晰便于统一管理. requ ...
- 关于如何写UI及屏幕适配的一些技巧
因为公司开启了一个新的iOS项目, 所以近期比较忙, 没有更新博客,今天打算总结一下关于UI布局及屏幕适配的一些实战技巧,尤其使用纯代码,会对提升效率及代码易于维护等方面有明显帮助,这里提到的没有使用 ...
- 如何优雅的写一篇安利文-以Sugar ORM为例
前言 我最近喜欢把写的十分优美的技术文章叫做安利文.首先,文章必须是原创而非软广:其次,阅读之后不仅能快速吸纳技术要点并入门开发,还能感同身受的体会作者热情洋溢的赞美和急于分享心得体验的心情,让人感觉 ...
- 【Xamarin挖墙脚系列:代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧(转)】
正愁如何选择构建项目中的视图呢,现在官方推荐画板 Storybord...但是好像 xib貌似更胜一筹.以前的老棒子总喜欢装吊,用代码写....用代码堆一个HTML页面不知道你们尝试过没有.等页面做出 ...
随机推荐
- vue的webpack打包
一个完整的项目离不开 开发环境 生产环境 测试环境 这三个环境 首先解释一下这三个环境的含义 开发环境:开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告 ...
- win2003系统同步Linux ntp server批处理
最后更新时间: 2018/12/15 一般windows配置时间服务器,只需要在windows系统右下角,点时间,里面配置好对应NTP服务器地址就行, 至多再修改一下注册表 HKEY_LOCAL_MA ...
- 在线运行python代码-python代码运行助手
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432523496782e ...
- 紫书 习题 10-5 UVa 1213(01背包变形)
这里就是01背包多了一维物品个数罢了 记得不能重复所以有一层循环顺序要倒着来 边界f[0][0] = 1 #include<cstdio> #include<vector> # ...
- 【Codeforces Round #462 (Div. 1) B】A Determined Cleanup
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 设\(设f(x)=a_d*x^{d}+a_{d-1}*x^{d-1}+...+a_1*x+a_0\) 用它去除x+k 用多项式除法除 ...
- C# DataTable中按字符串中的数字排序
例如datatable中有一列是门牌号格式是xx-xx-xx,或字符串中含有汉字或其他符号等等,如何按照正确的数字顺序排序呢? 1.获得字符串中的数字. 2.在datatable中添加一列,类型是In ...
- python里面 __future__的作用 & 下划线的作用 & 3.0实现不换行
参考这篇文章: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820 ...
- 使用ThoughtWorks.QRCode生成二维码
新建Windows应用程序,加入引用ThoughtWorks.QRCode.dll,编写代码生成二维码. using System; using System.Drawing; using Syste ...
- 制作自己的特色PE----Mr.Zhang
必备的文件和工具 win7.iso/win8.iso Windows系统ISO镜像 WimTool BOOT.WIM文件的改动 RegWorkShop 注冊表编辑和分析利器 UltraISO 改动wi ...
- java静态类、静态方法、静态代码块,静态变量及实例方法,实例变量初始化顺序及内存管理,机制
1.当一个类被第一次使用时,它需要被类加载器加载,而加载过程涉及以下两点: (1)在加载一个类时,如果它的父类还未被加载,那么其父类必须先被加载: (2)当类加载到内存之后,按照在代码中的出现顺序执行 ...