首 页 ┆ 源码下载 ┆ IT学院 ┆ 字体下载 ┆ 模板下载 ┆ 源码发布 ┆ 广告合作 ┆ 网站地图 ┆ 虚拟主机 ┆ 中文域名
► 设为首页
► 加入收藏
► 联系我们
源码下载 >> ASP源码 | PHP源码 | ASP.net源码 | JSP源码 | CGI源码 | VC/C++源码 | VB源码 | Delphi源码 | Flash源码
文章学院 >> 网络编程 | 网页设计 | 图形图象 | 数据库 | 服务器 | 网络媒体 | 网络安全 | 操作系统 | 办公软件 | 软件开发 | 黑客知识
字体下载 >> 精制字体 | 非英字体 | 艺术字体 | 著名字体 | 哥特式 | 简单字体 | 手写体 | 节假日 | 图案字体 | 精度像素 | 中文字体
模板下载 >> 企业门户 | 数码网络 | 休闲娱乐 | 影视音乐 | 旅游名胜 | 文化艺术 | 电子商务 | 个性展示 | 登陆导航 | Flash模板
►►您当前的位置:源码园 → IT学院 → 软件开发 → VC编程 → 文章内容

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

作者:佚名  来源:网上收集  发布时间:2007-3-27 10:14:39
 

在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 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_TAB_BAR。在MainFrm.cpp中消息映射部分加入以下两行:
ON_COMMAND_EX(ID_VIEW_TAB_BAR, OnBarCheck)  ON_UPDATE_COMMAND_UI(ID_VIEW_TAB_BAR, OnUpdateControlBarMenu)
8、在CMainFrame::OnCreate()加入以下代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){       //向导生成代码略去   //创建TAB条   if (!m_wndTabBar.Create(this, IDD_TAB_DLG_BAR,CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_HIDE_INPLACE,ID_VIEW_TAB_BAR)) //ID_VIEW_TAB_BAR是菜单命令ID,用于显示或隐藏对话框条   {TRACE0("Failed to create dialog bar m_wndDialogbar\n");return -1;// fail to create   }   //m_wndTabBar.EnableDocking(CBRS_ALIGN_LEFT | CBRS_ALIGN_RIGHT);   //EnableDocking(CBRS_ALIGN_ANY);   //DockControlBar(&m_wndTabBar);   //将m_MyTab与控件IDC_TAB绑定   m_MyTab.SubclassDlgItem(IDC_TAB, &m_wndTabBar);    return 0;}
9、为类CMainFrame添加WM_SIZE消息映射函数,如下:
void CMainFrame::OnSize(UINT nType, int cx, int cy) {   CMDIFrameWnd::OnSize(nType, cx, cy);   // TODO: Add your message handler code here   CRect rcClient;   GetClientRect(&rcClient);   int left,top,right,bottom;   left=rcClient.left;   top=rcClient.top;   right=rcClient.right;   bottom=rcClient.bottom;   m_wndTabBar.MoveWindow(left,top+24,right-left,24,TRUE);   CRect rcTab;   m_wndTabBar.GetClientRect(&rcTab);   CTabCtrl *pMyTab=(CTabCtrl *)(m_wndTabBar.GetDlgItem(IDC_TAB));   pMyTab->MoveWindow(rcTab,TRUE);}
三、手工创建类CViewManager
新建两个文件ViewManager.h、ViewManager.cpp ,并添加到当前工程。类的
源码参见本文所附例子。下面对其成员作简单说明:
  • OnActivateView();          //当一个视被激活时,该函数被调用,刷新Tab控件
  • GetWindowNum();            //返回打开的子窗口数
  • RemoveAll();               //清空数组arViews、arViewTitles
  • RemoveView();              //用于在数组及Tab控件中删除一项
  • AddView();                 //用于在数组及Tab控件中加入一项
  • CViewManager();            //构造函数
  • ~CViewManager();           //析构函数,清空数组arViews、arViewTitles
  • CPtrArrayarViews;         //用来存放子窗口的视指针
  • CstringArray arViewTitles; //用来存放文档标题
  • boolbClosing;             //用于表示程序是否正在关闭
四、实现文件切换。
  • 1、在MainFrm.h文件加入:#include "ViewManager.h"
  • 2、为类CMainFrame加入公有成员变量:
public:    CViewManager m_ViewManager;
3、在视类TabMDIDemoView.cpp文件中加入:#include "MainFrm.h"
4、重载视类的OnInitialUpdate()函数,编辑如下:
void CTabMDIDemoView::OnInitialUpdate() {   CView::OnInitialUpdate();   //取得文档标题及视指针并加入到视管理器数组及tab控件中   CMDIDialogbarDoc* pDoc = GetDocument();   ASSERT_VALID(pDoc);   CString cs=pDoc->GetTitle();   ((CMainFrame*)AfxGetMainWnd())->m_ViewManager.AddView(cs,this);}
5、在视类的析构函数中加入以下代码:
CTabMDIDemoView::~CTabMDIDemoView(){   ((CMainFrame*)AfxGetMainWnd())->m_ViewManager.RemoveView(this);}
6、重载视类的OnActivateView()函数,编辑如下:
void CTabMDIDemoView::OnActivateView(BOOL bActivate,                                     CView* pActivateView,                                      CView* pDeactiveView) {// TODO: Add your specialized code here and/or call the base class((CMainFrame*)AfxGetMainWnd())->m_ViewManager.OnActivateView(bActivate, this);CView::OnActivateView(bActivate, pActivateView, pDeactiveView);}
五、编译
[] [返回上一页] [打 印]
  • 上一篇文章:类似EXCEL的开发库(更新)
  • 下一篇文章:VC控件 TreeCtrl 与 ListCtrl 演示

  • 相关文章:
  • [图文]在MDI程序中实现类似WPS2000的文件切换标签
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 源码发布
Copyright © 2003-2009 Ymyasp.Com. All Rights Reserved .
备案序号:粤ICP备07029071号