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

2016-01-29 12:04 13 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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

编译/NorthTibet

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载本文例子源代码


    众所周知,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

来源:http://www.tulaoshi.com/n/20160129/1484455.html

延伸阅读
一、前言 用计算机进行数字图像处理的目的有两个,一是产生更适合人类视觉观察和识别的图像,二是希望计算机能够自动进行识别和理解图像。无论是为了何种目的,图像处理的要害一步是对包含有大量各式各样景物信息的图像进行分解。分解的最终结果就是图像被分成一些具有各种特征的最小成分,这些成分就称为图像的基元。产生这些基元的过...
自从微软公司推出Windows 95操作系统以来,系统托盘应用作为一种极具吸引力的用户界面设计深受广大用户的喜爱。使用系统托盘作为用户界面的Windows应用程序数不胜数,比如"金山词霸"、"Winamp"、"RealPlayer"等等。 这些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,程序开发人...
标签: 电脑入门
有时用某些工具扫描硬盘时,会在NTFS分区根目录下发现$extend文件夹(当然如果你的硬盘分区格式是FAT32就不会看到它了),可能某些工具会报告说$extend文件夹体积很大,但是千万不要不随便清理(直接是看不到也清不了它的,除非你用PowerTool、XueTr等工具,或进入PE系统才可能看到它和对其操作),如果误删了$extend或其中的文件或文件夹,可能导...
  适用于: Microsoft Visual C++ .NET 2003 Microsoft Visual C++ Toolkit 2003 Microsoft Visual Studio .NET 摘要: 演示了 Visual C++ 2003 编译器提供的众多代码优化功能中的几项功能。(8 ...
标签: excel
excel批量创建新建文件夹?   许多人在工作中会遇到需要批量创建文件夹的问题,比如做人事工作的人可能要把每个人的信息存放在文件夹中,一个个创建,一个个命名太麻烦了,累而且工作效率也不高。本篇为您讲解一个简单而有快速的好办法。我们可以通过Excel来批量创建文件夹。 第一步、首先打开Excel创建一个新的工作表,在表格中...

经验教程

384

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部

如果您有什么好的建议或者疑问,可以联系我们。 商务合作QQ:3272218541;3282258740。商务合作微信:13319608704;13319603564。

加好友请备注机构名称。让我们一起学习、一起进步tulaoshi.com 版权所有 © 2019 All Rights Reserved. 湘ICP备19009391号-3

微信公众号