当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 实现类似Excel和Visual C++里文件夹式样的标签控制(一)

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

VC++ 中的 实现类似Excel和Visual C++里文件夹式样的标签控制(一)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 60 ::
收藏到网摘: n/a

实现类似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中通过调用一个特殊的函数,在运行时将静态文本替换成标签控制。
 m_wndFolderTab.CreateFromStatic(IDC_FOLDERTAB, this); 
    CFolderTabCtrl::CreateFromStatic 在静态文本控件的位置上创建一个标签控制,然后删除静态文本控件。这是我创建特殊对话框控制常用的绝招,我认为这个诀窍是超一流的。在调用Create之前,CreateFro