在MDI程序中实现类似WPS2000的文件切换标签

2016-01-29 12:07 7 1 收藏

在MDI程序中实现类似WPS2000的文件切换标签,在MDI程序中实现类似WPS2000的文件切换标签

【 tulaoshi.com - C语言心得技巧 】

在MDI程序中实现类似WPS2000的文件切换标签


作者:山西大同 张聪

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)


下载源代码

    用过WPS2000的朋友,肯定对其文件切换功能有很深的印象。当打开多个文件时,他可以使我们快速的切换到指定的文件。本文将详细地说明如何在自己的MDI程序中加入这样一个标签。 图一是本文例子程序运行画面。


图一 例子程序运行画面

开始之前,我们先对WPS2000中的文件切换标签做简单分析,这是一个Tab标签,该标签具有以下功能: 1、当鼠标移到Tab标签上时,对应的文字将变为蓝色; 2、新建或打开一个文件时,Tab标签会以文件标题为标签文本自动加入一项; 3、切换Tab标签时,对应的文件窗口会跟着切换; 4、当我们激活不同的文件窗口时,Tab标签会自动切换; 5、关闭一个文件窗口时,Tab标签中对应的项会自动消失。 在本文的例子中,除实现上述功能外,还作如下修改: 1、增加双击Tab标签时最大化、恢复子窗口功能; 2、修改Tab标签为按钮风格。 具体思路:
    在MDI程序中加入一个包含Tab标签的对话框条,并加入类CViewManager,该类用一个指针数组存放所有打开子窗口的视指针,用一个字符串数组存放文档标题。在视类的初始化函数OnInitUpdate() 里取得视指针及文档标题,存放到CViewManager的数组中,并在Tab标签中加入一项。在视类的析构函数里从Tab标签和CViewManager的数组中删除对应的项。切换Tab标签时,取得对应子窗口的指针,并以该指针为参数调用CMDIFrameWnd::MDIActivate()激活这个子窗口。下面请看具体的实现步骤:

一、在VC6.0中,用向导创建一个MDI工程TabMDIDemo。在向导各步中均采用默认项

二、为工程加入Tab标签对话框条

1、在工作区的ResourceView中加入一个对话框模板IDD_TAB_DLG_BAR,按如下设置:

    Style: Child    Border: Thin    去掉标题条和系统菜单选项;    字体:宋体,字号:10    
在模板中加入一个Tab标签控件IDC_TAB,按如下设置:
    选中按钮选项。//这使的Tab标签呈现按钮风格    选中Hot Track选项。//这使得鼠标移上时文字变蓝
仔细调整对话框条及Tab控件的位置、尺寸。创建主框架时,将以该模板创建出Tab标签对话框条。
2、利用类向导加入类CMyTab,派生于CTabCtrl。
3、利用类向导为类CMyTab添加TCN_SELCHANGE通知消息映射函数,实现文件切换,编辑如下:
void CMyTab::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) {     // TODO: Add your control notification handler code hereint idx = GetCurSel();TC_ITEM ti;ti.mask = TCIF_PARAM;GetItem(idx, &ti);CView * pView = (CView *) ti.lParam;((CMDIFrameWnd *)AfxGetMainWnd())-MDIActivate((pView-GetParent())-GetParent());*pResult = 0;*pResult = 0;}
4、利用类向导为类CMyTab添加WM_LBUTTONDBLCLK消息映射函数,实现双击时最大化或恢复子窗口,编辑如下:
void CMyTab::OnLButtonDblClk(UINT nFlags, CPoint point) {    // TODO: Add your message handler code here and/or call default    int idx = GetCurSel();    TC_ITEM ti;    ti.mask = TCIF_PARAM;    GetItem(idx, &ti);    CView * pView = (CView *) ti.lParam;    ((CMDIFrameWnd *)AfxGetMainWnd())-MDIActivate((pView-GetParent())-GetParent());    // maximize or restore MDIChild window based on its current state    BOOL bMaximize=FALSE;    CWnd* pActiveWnd=((CMDIFrameWnd *)AfxGetMainWnd())-MDIGetActive(&bMaximize);    if(bMaximize)((CMDIFrameWnd *)AfxGetMainWnd())-MDIRestore(pActiveWnd);    else((CMDIFrameWnd *)AfxGetMainWnd())-MDIMaximize(pActiveWnd);}   
5、在MainFrm.h中加入:#include "MyTab.h"
6、为主框架类CMainFrame加入如下成员变量:
protected:  CDialogBar m_wndTabBar;public:CMyTab m_MyTab;  
7、在菜单资源"查看"中加入菜单项"文件切换",ID值为ID_VIEW_T

来源:https://www.tulaoshi.com/n/20160129/1484693.html

延伸阅读
标签: 办公软件
在WPS2000下打印、预览时文件时,每页第一行文字总有部分(或整行)被遮盖,怎么解决这个问题呢?经过摸索发现,这是由于纸张上边距设置不当造成的,解决方法很简单,只需在页面设置中,将纸张上边距设置≥22mm即可。那么,为什么纸张上边距不能小于22mm呢? 查看AR3200+打印机的...
标签: Web开发
随着AJAX范例得到越来越广泛的应用,浏览器页面可以在向后台服务器请求数据的同时保持前端用户界面的活跃性(因此在AJAX中称为异步)。然而,当这两个活动同时访问共用的JavaScript和DOM数据结构时就会引发问题。JavaScript没有提供针对该并发程序问题的经典解决方案。本文描述了作者在互斥机制方面的新见解,该经过验证的互斥机制在JavaSc...
     Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。              &nb...
在.NET框架下的C#语言,和其他.NET语言一样提供了很多强大的特性和机制.其中一些是全新的,而有些则是从以前的语言和平台上照搬过来的。然而,这种巧妙的结合产生了一些有趣的方法可以用来解决我们的问题。这篇文章将讲述如何利用这些奇妙的特性,用插件(plug-ins)机制建立可扩展的解决方案。后面也将提供一个简要的例子,你甚至可以用这个...
标签: 电脑入门
随着网站技术的日益增进,Flash已经成为当下流行的一种动画格式,而在流行办公软件演示文档里面插入Flash却总是需要劳师动众,稍微一个小设置的失误,则往往导致满局皆错。那么,我们是需要把操作步骤仔细认真地记录在本子里面,然后到处翻看;或者是,不用则已,要用的时候再从baidu上搜索一番;如此如此 前一阵子在一位高人指点下小试了一下...

经验教程

353

收藏

19
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部