在MFC实现桌面程序时,可能会用到TabView效果,我实现的是最基本的效果,如下图:

下面介绍详细的实现过程,如果需要效果更好看些,自行美化。

1、  创建自定义MFCTabCtrl类MyMFCTabCtrl继承自CMFCTabCtrl。之所以要自己实现自定义的控件,主要是因为MFC自带的MFCTabCtrl无法实现标签页的关闭。怎么new一个新的类并继承该继承的父类,不再叙述。

2、  在自定义的类中需要重载左鼠标按下的消息。即添加如下图消息

消息处理函数如下,记住一定要先执行基类,即把执行父类中左键按下的消息代码放在最前面:

 void CMyMFCTabCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//要先执行基类,否则界面会失去焦点
CMFCTabCtrl::OnLButtonDown(nFlags, point);
if(m_rectCloseButton.PtInRect(point))
{
int nTab = GetActiveTab();
if(nTab > -)
{
//这个是我工程里面每个标签页的界面
CPortSet *dlg = (CPortSet *)GetTabWnd(nTab);
dlg->SendMessage(WM_DESTROY,,);
RemoveTab(nTab);
}
}
}

3、  在调用CMyMFCTabCtrl的类中定义变量:CMyMFCTabCtrl m_tabCtrl;实现代码如下:

m_tabCtrl.Create(CMyMFCTabCtrl::STYLE_FLAT,tabRect,this,,CMFCTabCtrl::LOCATION_BOTTOM);
m_tabCtrl.EnableScrollBar(SB_BOTH);
m_tabCtrl.EnableActiveTabCloseButton();

4、 添加WM_SIZE消息函数,保证控件随窗口大小变化而变化。

void CIMU4View::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
//获取当前窗体的大小,用于设置tabctrl的大小 if(m_tabCtrl/*&& nType != 1*/)
{
CRect tabCtrlRect;
m_tabCtrl.GetClientRect(&tabCtrlRect);
//将控件大小转换为对话框中的区域坐标
ScreenToClient(&tabCtrlRect);
//cx/m_viewRect.Width()是对话框的横向变化比例
tabCtrlRect.left = ;
tabCtrlRect.right = cx;
tabCtrlRect.top = ;
tabCtrlRect.bottom = cy;
m_tabCtrl.MoveWindow(&tabCtrlRect);
}
GetClientRect(&m_viewRect);
}

MFC--自定义CMFCTabCtrl的实现的更多相关文章

  1. 【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能

    参考地址:MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能   Ctrl组合键ASCII码 ^Z代表Ctrl+z                     ASCII值 控制字符  AS ...

  2. VC++6.0/MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能

    Ctrl组合键ASCII码 ^Z代表Ctrl+z                     ASCII值 控制字符  ASCII值 控制字符  ASCII值 控制字符  ASCII值 控制字符0(00) ...

  3. Qt之自定义托盘

    说起Qt,真是个不错的ui库,不仅仅ui做的好,其他方面也不差,在平台扩展方面也是非常的强大.这篇文章我将会分析下qt的托盘,QSystemTrayIcon是qt的托盘类,托盘类的用途是什么我就不说了 ...

  4. MFC 控件使用教程

    combo box控件用法: 下拉选择控件,首先将控件拖动到你需要使用控件的地方,用ClassWizard为它关联一个变量,我们注意到变量类型是CString型的.右击属性,General中可以设置一 ...

  5. MFC的六大机制

    MFC的六大机制 程序的初始化过程 运行时类型识别 动态创建 永久保存 消息映射 命令传递 运行时类型识别 MFC的运行时类型识别就是在程序运行过程中判断某个对象是否属于某个类,MFC通过为需要进行运 ...

  6. Windows消息大全

    最近在写TabControl的用户控件,需要用到sendMessage,已做备份. 引用:http://bbs.aau.cn/forum.php?mod=viewthread&tid=7776 ...

  7. Windows窗口消息大全(转)

    Windows窗口消息大全,全不全自己看 ////////////////////////////////////////////////////////////////////////// #inc ...

  8. Windows窗口消息大全

    ////////////////////////////////////////////////////////////////////////// #include "AFXPRIV.H& ...

  9. RepositionBars的用法和参数的意义(引用别人的)

    MFC窗口位置管理详细分析及实例 在一般用MFC编写的程序的窗口客户区中,可能有好几个子窗口(具有WM_CHILD风格的窗口).上边是工具栏,中间是视图窗口,下边是状态栏.三个窗 口在框架的客户区里和 ...

  10. Windows消息类型

    WM_ Window Message 窗口消息,一般用在SendMessage,PostMessage这样的消息函数中 SM_ Static Message 静态标签消息 SS_ Static Sty ...

随机推荐

  1. <2014 05 16> 线性表、栈与队列——一个环形队列的C语言实现

    栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外, ...

  2. centos7在vmware上无法上网

    centos7在虚拟机中设置NAT后也无法上网! 首先激活网卡!打开桌面右键在终端中打开:cd /etc/sysconfig/network-scripts/ls 找到以ifcfg开头的,如ifcfg ...

  3. Vue中动态添加多个class

    vue中可以通过 :class=""这样来根据一定的条件来动态添加class,但是有时候需要判断的条件比较多,需要动态添加的class也比较多,这个时候其实也很简单 先看一下示例: ...

  4. 洛谷 P2300 合并神犇

    洛谷 听说这题可以\(n^2\)水过去,不过这里介绍一种\(O(n)\)的做法. \(f[i]\)为第\(1-i\)位合并的次数. \(pre[i]\)为第\(1-i\)位最末尾的数. \(j\)为满 ...

  5. 【我的Android进阶之旅】 Google Developers中国网站发布啦!

    今天,Google Developers 中国网站 (https://developers.google.cn) 正式发布! Google Developers 中国网站是特别为中国开发者而建立的,它 ...

  6. Django的model模型

    一:字段选项 1,null =True 表示数据库的中可以存为null  默认值是False 2,blank=True  表示字段可以为空  默认值是False 3,chioces 由二项元组构成的一 ...

  7. Android—Http连接之GET/POST请求

    在Android SDK中提供了Apache HttpClient(org.apache.http.*)模块.在这个模块中涉及到两个重要的类:HttpGet和HttpPost.    创建步骤:    ...

  8. python16_day07【class】

    一.初识类 1.类的两种作用:属性引用和实例化 class Garen: #定义英雄盖伦的类,不同的玩家可以用它实例出自己英雄; camp='Demacia' #所有玩家的英雄(盖伦)的阵营都是Dem ...

  9. mysql增量恢复的一个实例操作

    通过防火墙禁止web等应用向主库写数据或者锁表,让主库暂时停止更新,然后进行恢复 模拟整个场景 1.登录数据库 [root@promote 3306]# mysql -uroot -S /data/3 ...

  10. zend studio设置utf8

    1. windows -> preference -> general -> workspace 2.项目右键 -> properities -> resource 3. ...