当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 在MDI程序中实现类似WPS2000的文件切换标签

VC++
宏的妙用
泛型编程与设计新思维
C++中的虚函数(一)
C++模板元编程
C++多态技术
通用结构复制函数
<C++实践系列>C++中的虚函数(virtual function)
<C++实践系列>C++中的引用(reference)
<C++实践系列>C++中的异常(exception)
<C++实践系列>C++中的模板(template)
构造函数中的this指针
串行化(Serialization)
二进制浏览、编辑的实现
介绍一个模板动态数组
VC++界面一揽子解决方案(第三版) 介绍
VC++通用GIS功能开发解决方案 2.0v 介绍
确定有穷自动机分析内核
委托、信号和消息反馈的模板实现技术
按照类型名称动态创建对象
Boost中应用的泛型编程技术

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 132 ::
收藏到网摘: n/a

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


作者:山西大同 张聪


下载源代码

    用过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 here	int 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