65.9K
CodeProject 正在变化。 阅读更多。
Home

AIM 风格滚动横幅控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.14/5 (4投票s)

2001年7月1日

3分钟阅读

viewsIcon

110509

downloadIcon

2471

一个滚动横幅控件,包含具有独立样式和颜色的字符串。

Sample Image - BannerTester.jpg

引言

您是否曾经想在您的应用程序中包含一个控件,其行为类似于带有滚动文本的网页横幅广告。 这种效果也出现在美国在线即时通讯工具 (AOL Instant Messenger) 的新闻栏中。 一堆超链接快速闪过,显示新闻标题,您点击标题即可转到文章。 当然,如果所有字符串都必须具有相同的样式和颜色,那就没什么用处了。 如果每个字符串能够拥有自己的独立样式和颜色,那就更好了。 这种类型的事情可以使用 CBannerStatic 类来实现。 那么,我们需要什么才能使用这个控件呢?

解释

首先,我们需要一个字符串集合,每个字符串都有自己的颜色和样式(带下划线、斜体等) - 输入 CString 派生的 CColorString 类。 它使用 DWORD 来保存颜色和值参数。 由于 COLORREF 仅使用低 3 个字节来跟踪颜色,我使用高字节来存储样式信息,例如字符串是否为斜体、带下划线或粗体。 CColorString 也可以存储背景颜色; 我为此浪费了另一个 DWORD。 将来,我可能会将样式值移到 BOOL 类型,以便代码更易于理解; 我们应该摆脱 C++ 中的位掩码操作!

既然我们有一个封装知道自己样式的字符串的类,我们需要一个知道如何显示它们的控件。 输入 CMultiColorStatic。 它与 CColorStatic 类型的控件非常相似,但它是一个静态对象,允许输入多个字符串,每个字符串都有自己的样式。 这是通过使用 CPtrArray 来完成的,以跟踪已添加到控件中的所有 CColorString。 诚然,使用一个 CMultiColorStatic 而不是一堆 CColorStatics 并没有太大的收益; 我只是想让一个控件作为 CBannerStatic 的基础。

说到 CBannerStatic,这是拼图的最后一块。 CBannerStatic 将滚动与多字符串的灵活性结合在一起。 对于滚动,它使用多媒体计时器,以便在任何 Windows 平台上实现类似的精度(使用普通计时器,Windows NT 的精度为 10 毫秒,而 Win9x 的精度仅为 55 毫秒)。 我只将多媒体计时器用于精度; 当我收到计时器消息时,我向控件发送一个 WM_TIMER 消息,并且绘图在 WM_TIMER 处理程序中完成。 当绘图变得复杂时,包含横幅的应用程序可能会变得无响应,因为绘图需要比滚动更长的时间。 此时绘图已完成,是时候再次滚动了。 通过保留消息结构,应用程序将永远不会变得无响应。

整个事情使用起来相当简单,但可能需要一些时间来适应。 CBannerStatic 提供了一种允许用户单击项目并获得结果的巧妙方法。 客户端还可以使用 ItemClick 回调函数设置项目光标。 这里解释一切有点多,但是示例应用程序 BannerTester 在演示 CBannerStatic(以及 CMultiColorStatic)的功能集方面非常全面。

一些注意事项:如果将控件设置为很大和/或具有很多消息字符串,则它可能会很慢。 它会拖垮整个系统 - 所以要小心!

最后一句话:我不喜欢使用预编译头文件,您会发现,如果您只是使用提供的类,编译器会抱怨未包含 "StdAfx.h"。 如果您遇到此问题,您只需将 #include "StdAfx.h" 添加到这三个类的每个 cpp 文件中。

© . All rights reserved.