AIM 风格滚动横幅控件






4.14/5 (4投票s)
2001年7月1日
3分钟阅读

110509

2471
一个滚动横幅控件,包含具有独立样式和颜色的字符串。
引言
您是否曾经想在您的应用程序中包含一个控件,其行为类似于带有滚动文本的网页横幅广告。 这种效果也出现在美国在线即时通讯工具 (AOL Instant Messenger) 的新闻栏中。 一堆超链接快速闪过,显示新闻标题,您点击标题即可转到文章。 当然,如果所有字符串都必须具有相同的样式和颜色,那就没什么用处了。 如果每个字符串能够拥有自己的独立样式和颜色,那就更好了。 这种类型的事情可以使用 CBannerStatic
类来实现。 那么,我们需要什么才能使用这个控件呢?
解释
首先,我们需要一个字符串集合,每个字符串都有自己的颜色和样式(带下划线、斜体等) - 输入 CString
派生的 CColorString
类。 它使用 DWORD
来保存颜色和值参数。 由于 COLORREF
仅使用低 3 个字节来跟踪颜色,我使用高字节来存储样式信息,例如字符串是否为斜体、带下划线或粗体。 CColorString
也可以存储背景颜色; 我为此浪费了另一个 DWORD
。 将来,我可能会将样式值移到 BOOL
类型,以便代码更易于理解; 我们应该摆脱 C++ 中的位掩码操作!
既然我们有一个封装知道自己样式的字符串的类,我们需要一个知道如何显示它们的控件。 输入 CMultiColorStatic
。 它与 CColorStatic
类型的控件非常相似,但它是一个静态对象,允许输入多个字符串,每个字符串都有自己的样式。 这是通过使用 CPtrArray
来完成的,以跟踪已添加到控件中的所有 CColorString
。 诚然,使用一个 CMultiColorStatic
而不是一堆 CColorStatic
s 并没有太大的收益; 我只是想让一个控件作为 CBannerStatic
的基础。
说到 CBannerStatic
,这是拼图的最后一块。 CBannerStatic
将滚动与多字符串的灵活性结合在一起。 对于滚动,它使用多媒体计时器,以便在任何 Windows 平台上实现类似的精度(使用普通计时器,Windows NT 的精度为 10 毫秒,而 Win9x 的精度仅为 55 毫秒)。 我只将多媒体计时器用于精度; 当我收到计时器消息时,我向控件发送一个 WM_TIMER
消息,并且绘图在 WM_TIMER
处理程序中完成。 当绘图变得复杂时,包含横幅的应用程序可能会变得无响应,因为绘图需要比滚动更长的时间。 此时绘图已完成,是时候再次滚动了。 通过保留消息结构,应用程序将永远不会变得无响应。
整个事情使用起来相当简单,但可能需要一些时间来适应。 CBannerStatic
提供了一种允许用户单击项目并获得结果的巧妙方法。 客户端还可以使用 ItemClick
回调函数设置项目光标。 这里解释一切有点多,但是示例应用程序 BannerTester
在演示 CBannerStatic
(以及 CMultiColorStatic
)的功能集方面非常全面。
一些注意事项:如果将控件设置为很大和/或具有很多消息字符串,则它可能会很慢。 它会拖垮整个系统 - 所以要小心!
最后一句话:我不喜欢使用预编译头文件,您会发现,如果您只是使用提供的类,编译器会抱怨未包含 "StdAfx.h"
。 如果您遇到此问题,您只需将 #include "StdAfx.h"
添加到这三个类的每个 cpp 文件中。