没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-11-14 10:52:00.000|阅读 1687 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
下载源代码
用过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
CPtrArray arViews; //用来存放子窗口的视指针
CstringArray arViewTitles; //用来存放文档标题
bool bClosing; //用于表示程序是否正在关闭
四、实现文件切换。
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);
}
五、编译
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号