分享
 
 
 

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

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

在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_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);

}

五、编译

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有