您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:38 来源:vckbase.com

本文章共5059字,分4页,当前第1页,快速翻页:
 

实现类似Excel和Visual C 里文件夹式样的标签控制(一)
——实现基本功能

编译/NorthTibet

逆风编程精品
下载本文例子源代码


众所周知,Excel中一个工作簿可以有多个工作表单(worksheet),每个表单可以通过左下角的标签控制灵活切换(如图一),Visual C 也有类似的控制,如在Output窗口中设置有:Build,Debug,Find in Files和Results等标签控制(如图二)。


图一Excel中的标签控制



图二 Visual C 中的标签控制

我们将这种界面称为文件夹式样的标签控制,以下简称标签控制,而将MFC中的Tab Control称为标签控件。那么标签控制是如何实现的呢?MFC中有没有现成的控件可以利用?

论坛中有很多人提出过这个问题。看了本文以后,我想这个问题应该有一个圆满的答案。MFC固然给编程带来了极大的方便,但是它并不能代替程序员的编程,MFC只是提供了一个编程框架,应用的实质性代码还是必须由程序员自己来写。同时,MFC的问题也是显而易见的,那就是其GUI素材太丰富,以至于程序员们过分依赖MFC,当想要实现MFC中没有的GUI特性时便不知所措。
下面我们就来看看如何实现图一和图二所示的文件夹式样的标签控制界面。有人可能想到了从现成的标签控件(Tab Control)入手。但是经验证明:为了使用的方便性和更好的可重用性起见,还是不要采取这种方法。我是一个热衷于可重用性的家伙,但是这方面我们在自己的代码中做得还很不够。所以我宁愿自己创建一个窗口类,这样做还有一个好处是你能完全控制代码的修改,不必顾及因现有控件版本的变化而对自己的代码造成的巨大影响和麻烦。我想微软的家伙肯定也希望你这么做。如果你用Spy 查看一下Excel和Visual C 的界面就会发现其文件夹式样的标签控制并不是SysTabControl32s,而是另外创建的窗口类。为什么我们不也来创建一个呢?
请看图三所示的画面,这就是我编写的一个程序FldrTab,它实现了我们所要的界面功能。实现这个UI的C 类是我自己创建的,它叫CFolderTabCtrl。


图三 FldrTab 程序运行画面

有关CFolderTabCtrl的实现细节请参考源代码。其头文件为Ftab.h,实现文件为Ftab.cpp。在分析CFolderTabCtrl的实现原理之前,让我先来说明一下这个类的使用方法。当FldrTab程序的InitInstance函数获得控制权时,它创建一个主对话框的实例,并运行这个对话框:

BOOL CApp::InitInstance()

{

     CMyDialog dlg;

     m_pMainWnd = &dlg;

     dlg.DoModal();

     return FALSE;

}         
CMyDialog有两个控制:一个是m_wndStaticInfo,另一个是m_wndFolderTab。顾名思义,第一个控制为一个静态文本窗口,它显示选中的标签,第二个是标签控制本身,即CFolderTabCtrl实例。通过调用SubclassDlgItem,CMyDialog::OnInitDialog以常规方式子类化静态文本,遗憾的是它不能子类化标签控制,因为对话框中并没有实际的标签控制窗口。此外也没有办法借助COM技术将此标签控制实现为一个带运行时接口的定制控件。我的办法是在对话框想要放置标签控制的地方创建一个静态文本控件。如图五所示:


图五 用静态文本控件定位标签控制

在OnDialogInit中通过调用一个特殊的函数,在运行时将静态文本替换成标签控制。
 
本文章更多内容1 - 2 - 3 - 4 - 下一页>>
相关文章

动态真彩工具栏
C# 2.0匿名方法揭密
C QA 专栏:列表视图模式,SetForeground
MFC架构下的DirectX8
内存优化之道:托管代码的失传内存优化技术
推荐一个简单的托盘类
如何在C#应用程序和DLL中使用消息
连接 COM 与 .NET 的桥梁(三)——COM 服务
Windows 文件过滤驱动经验总结
一个基于MFC的XML封装类 CXml
TIF格式图像文件初探
子类化:增强Edit控件为日期输入控件
如何限制PC机上网
用VC轻松实现 ADO.net
ASP.NET 专栏:编写高性能 Web 应用程序的1
通用图像类算法扩充库
基于TCP的局域网多用户通信、文件传送程序详
通用权限管理模块的设计与实现
杂谈:人与软件
USB有关的编程

相关评论


本文章所属分类:首页 VC++

  热门关键字: