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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 135 ::
收藏到网摘: 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