CAppBar,一个 WTL 实现的 AppBar
一个可重用的 WTL 基类,用于支持 AppBar。
引言
关于停靠窗口的文章有很多,大多数都是关于应用程序内的工具窗口。然而,我发现很少有文章讨论 AppBar,它是一个用于 Windows 桌面的停靠窗口。一个正常的 AppBar 将占据四个侧面的某个桌面空间。AppBar 也可以设置为自动隐藏,这样当它不活动时就会消失,当鼠标光标移动到其边缘时就会出现。Windows 任务栏就是一个 AppBar。它是关于 AppBar 应该如何行为的最佳参考。
Win32 API 实际上提供了一个名为 SHAppBarMessage
的 API 函数来帮助程序员开发类似于 Windows 任务栏的 AppBars。当我们确实需要一个 AppBar 应用程序时,这个 API 可以完成很多工作。除了 SDK 文档之外,这篇文章是关于 SHAppBarMessage
的最佳参考。我们可以按照这篇文章创建一个 AppBar。MSDN 还提供了一个简单的示例应用程序。但是,这都是难以阅读和重用的旧式 SDK 代码。
我还在 CodeProject 中找到了这篇文章,它实现了一个 AppBar。但是,它不是基于 SHAppBarMessage
的。此外,代码对我来说太复杂了。
CAppBar 模板类
由于没有可用的代码可以重用,我决定创建自己的代码。WTL 似乎是最适合我重用代码的架构,所以我决定为任何 WTL 应用程序实现一个 CAppBar
模板类,以便重用。它应该像其他 WTL 类一样简单且足够灵活。并且它带有 CAppBar
类。
SHAppBarMessage
API 在 CAppBar
类中起着重要作用,但是,提供了许多其他代码使其成为一个可重用且功能齐全的类。它可以很容易地添加到任何 WTL 应用程序中。
用法
- 将
CAppBar
类用作基类。派生类也必须直接或间接派生自CWindowImpl
。 - 使用
CHAIN_MSG_MAP
将消息链到CAppBar
类。 - 在
OnCreate
或OnInitDialog
函数中调用InitAppBar
。 - (可选) 在运行时调用
DockAppBar
将窗口停靠到屏幕的任何一侧。 - (可选) 在运行时调用
SetAutoHide
以更改自动隐藏行为。 - (可选) 在运行时调用
SetKeepSize
以启用在屏幕上停靠时保持原始窗口大小。 - (可选) 如果您希望在停靠侧发生更改时执行任何特定操作,请以 ATL 方式覆盖
OnDockingChanged
函数。
特点
- 可以通过函数调用 (
DockAppBar
) 将应用程序停靠到桌面的任何一侧或从任何一侧分离。 - 可以通过在窗口的任何区域上拖动鼠标来移动应用程序窗口,并且可以在视觉上停靠或从桌面分离。
KeepSize
模式使应用程序窗口能够停靠在桌面上,同时保持其原始大小。仅当AutoHide
模式也启用时,此模式才会生效。
尽情享受吧
好的,代码和示例项目已附上。我希望它易于使用且易于阅读。我也希望有一天它能成为 WTL 的一部分。在编写此代码时,我使用了 Visual Studio 2003 和 WTL7.5。我没有在任何其他平台上测试过它。我希望它也能正常工作。如果不行,请给我发消息。我可能会尝试改进它。