ClassLib, 一个 C++ 类库






4.80/5 (31投票s)
C++ 类库。
注意
2.9 及以上版本的库将不再支持 Visual C++ 6.0。该库在 Visual Studio .NET 2003 中使用警告级别 4 编译通过。它至少应该可以在 Visual Studio .NET 2002 中编译,尽管尚未经过测试。提供的解决方案是 Visual Studio .NET 2003 解决方案。
引言
在主要用 C 编程了大约 10 年后,我大约一年前决定是时候开始学习 C++ 了。由于我当时也在努力掌握 Win32 API,所以我决定将两者结合起来,创建我自己的类库。结果就是你现在看到的东西。一个 C++ 类库,主要包含 Win32 数据类型等的封装。
我一直认为,从看别人的代码中学习到的最多。如果你在库中发现其他代码中使用的技术和代码,请不要惊讶。当你看到我公然复制自网上找到的各种来源的代码时,也请不要惊讶。我已尽力跟踪源代码和最初编写它的人。你会在下方找到一个列表。
特点
类库包含
- 窗口和对话框的封装类。
- MDI 支持。
- 位图菜单。
- 标准和常用控件的封装。
- 新的控件类,如
BalloonHelp
、ColorPicker
、ColorPopup
、Brainchild
、DirBrowser
、FileBrowser
、FileDirTree
、FlatButton
、HyperLink
、InfoBar
、InfoControl
、Splitter
等等。 - 为自定义控件提供 XP 风格渲染支持,并提供一种简单的方法将 XP 风格渲染添加到你自己的控件中。
- 一个完整的布局引擎,可让你轻松创建可调整大小的 GUI。
- 数组、链表和哈希表的收集器类。
- Win32 GDI 系统的封装,包括一些实用类。
- 一个字符串类。
- 一些实用类,如
BoyerMoore
、Crc16
、Crc32
、DrawState
、FindFile
、Module
、MRU
、RectTracker
、RegKey
、RGBHLS
、Theming
和WaitCursor
。
入门
我从来都不擅长写文档(我的雇主可以证明这一点;)),所以这个库没有文档。但是,源代码注释相当详细,应该很容易上手。而且由于大多数类都是简单的封装,MFC/Win32 程序员应该能够很快熟悉它。
除了注释过的源代码,还有几个示例程序,它们应该是很好的起点。
在开始之前,你必须将分发包中的文件解压到你的硬盘上的某个位置。完成此操作后,你应该在 Visual Studio 中进行以下设置:
- 在菜单“工具”->“选项...”下
- 在树形视图的“项目”下选择“VC++ 目录”。
- 在“显示目录”组合框中选择“包含文件”。
- 将文件解压的目录添加到“包含文件”搜索路径。也就是说,如果你将库源代码文件解压到 D:\ClassLib,则将此路径添加到包含文件中。
- 在“显示目录”组合框中选择“库文件”。
- 将 Classes\LIB 目录添加到“库文件”搜索路径。也就是说,如果你将库源代码文件解压到 D:\ClassLib,则在此处添加 D:\ClassLib\LIB。
这应该可以让你开始。为了减小分发包的大小,链接库没有包含在内。取而代之的是,包含了一个 Visual Studio .NET 2003 解决方案,你可以通过它自己创建这些库。双击分发目录中的 ClassLib.sln 文件,Visual Studio 将会打开。在其中,你可以选择构建“Win32 Release”、“Win32 Debug”、“Win32 Release Multithread”和“Win32 Debug Multithread”版本的链接器库。对于提到的每个库,你还可以编译一个 Unicode 版本。
Samples 压缩包包含一个解决方案和源代码,使你能够编译该库的示例程序。
技术详情
库的调试版本会为你跟踪一些内容。首先,内存泄漏(一定程度上)。如果你因为某种原因忘记释放使用 new
操作符或使用 malloc()
或 calloc()
分配的内存,代码将在退出时断言并显示内存未释放的消息。此外,当你在调试器控制下运行代码时,会显示未释放内存的分配行。这是使用 C 运行时库中的标准 Microsoft 调试支持来实现的。使用 new
操作符或 C 运行时库以外的方式分配的内存未释放引起的内存泄漏不会被报告。
调试库还会跟踪创建的窗口、GDI、设备上下文和菜单对象。这些对象在内部列表进行跟踪,当程序退出时此列表非空,程序将断言并告知哪个列表(或哪些列表)非空。
调试库还会跟踪创建的 GDI 和设备上下文句柄。如果它们在代码退出前未正确销毁,程序将在退出时断言。
除了确保你的代码自行清理之外,没有其他事情需要做,代码才能在不产生断言的情况下退出。
我想提到的另一件事是,new
操作符在无法分配所需内存时会抛出异常(参见 memoryexception.h)。
谢谢
正如我上面提到的,这个库中的一些代码是基于他人工作的。这是我曾用作示例,有时也直接使用的代码的作者列表。感谢你们所有人。
- Chris Maunder
我改编了
ClsColorPopup
(抱歉,用了美式拼写;))类以使其与此类库一起运行。该类进行了几次代码更改,包括窗口打开时的混合或滚动动画,以及在应用程序在 XP 上主题化运行时 XP 风格的渲染。ClsComboCompletion
类也是他编写的,我已将其改编到此库中。 - Joshua Heyer:
ClsBalloonHelp
类。我已经将此类改编到此库中。我对原始代码进行了一些更改,包括使用AnimateWindow()
API 而不是SetLayeredWindowAttributes()
和定时器进行另一种混合方式。我还绕过了使用定时器进行关闭按钮热跟踪的需要。最后但同样重要的是,它支持正文文本的文本样式,并在 XP 主题化运行时使用 XP 风格的关闭按钮。 - Microsoft 知识库文章 Q29240。
我使用了这篇文章中的代码来创建
ClsRGBHLS
类。此类别用于将 RGB 颜色转换为 HLS 值,反之亦然。 - ????
ClsString
类使用了一种缓冲区共享方法,该方法是我在为 Windows CE 编写的一个类库中的一个字符串类中找到的。很抱歉,我记不起是谁写的了,但如果你知道是谁,请告诉我,以便我能给予应有的荣誉。 - Todd Osborne
我使用了他的 VXCL 库做过两件事。首先,
ClsWindow
类使用的窗口过程很大程度上基于他的工作。其次,通用对话框封装部分也基于他的工作。 - Joseph M. Newcomer
我使用了他的 "Using Worker Threads" 文章来构建
ClsWorkerThread
类。 - Paolo Messina 和 Jerzy Kaczorowski
ClsHotButton
代码包含了他们的COddButton
代码,该代码解决了尝试组合所有者绘制按钮和默认状态时通常遇到的问题。 - Bruno Podetti
我使用他的钩子/子类化技术来为
ClsMenu
派生的菜单类启用自定义边框。 - Christian Graus
ClsBitmap
中的GetGrayscaledBitmap()
方法基于击中 "Per-Pixel" 滤镜文章。 - Carlos Antollini
ADO 和 ADOX 类最初由他编写。
- Daniel Bowen
该库包含了他
CustomTabCtrl
代码的移植。并非所有类都已移植,但最重要的类已移植。该库移植了他的DotNetTabCtrl
、DotNetButtonTabCtrl
和FolderTabCtrl
。当然,基础的CustomTabCtrl
也已移植。
我希望我没有忘记任何人。如果我忘记了,那是无意的,而不是故意的。
更改 (2.9 -> 3.0)
- 添加了用于编译库的 Unicode 版本的解决方案。但请注意,Unicode 支持未经测试。
- 添加了
ClsPanelBar
、ClsPanel
、ClsOutlookBar
和ClsXPOutlookBar
类。 - 对多个类进行了一些小的调整和添加。
- 添加了 Daniel Bowen 出色的
CustomTabCtrl
的移植。 - 由于移植,我还添加了一些宏,使消息解析更容易一些。尽管这些宏与 ATL/WTL 消息解析宏不兼容,但它们很相似。
- 各种调整和添加。
- 修复了大量错误。
更改 (2.7 -> 2.9)
此版本进行了大量的修复、调整和添加。此版本的主要更改是:
- 移植了 Carlos Antollini 的 ADO 和 ADOX 类。
- 添加了对自定义窗口框架渲染的支持,包括窗口框架中的标准和用户定义的按钮。
- 添加了 RichEdit 封装。
- 添加了用于可热跟踪的普通和 XP 风格编辑框和组合框的类。
有关更改的完整列表,请查看源代码 Zip 文件中的 History.txt 文件。