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

CCreditsCtrl - 高级关于框

starIconstarIconstarIconstarIconstarIcon

5.00/5 (14投票s)

2001年1月8日

viewsIcon

211310

downloadIcon

4937

又一个功能齐全的控件,用于显示滚动字幕...

引言

我试了 Mark Findlay 的 滚动字幕对话框 和 Darren S. Gonzales 的 滚动屏幕字幕,坦白说我很失望。你根本无法进行格式化,除了在 Darren 的版本中选择四种预定义的文本标题中的一种,而且它不符合我对“高级”关于对话框的要求,因为你通常会想要添加一两个超链接,也许还有复活节彩蛋,谁知道呢 :)

而且,恕我直言,如果你不能做得更好,就说(甚至认为)某样东西很糟糕是很懦弱的,所以我开始编码了。

总之,这个控件允许你显示格式化的滚动文本和图像,这通常用于“关于”对话框以显示字幕。其功能包括:

  • 扩展格式化功能;
  • 支持内嵌资源位图;
  • 你可以将文本和图像定义为超链接,这些超链接可以触发 `ShellExecute` 命令或用户定义的(回调)函数;
  • 文本字体、大小、样式和颜色以及图像边框颜色,在鼠标指针移到超链接上时可以更改;
  • 你可以制作花哨的所有者绘制的背景效果;
  • 支持文本和位图透明;
  • 如果内容总大小小于控件,则不滚动;
  • 可以选择用户是否可以手动滚动内容;
  • 抱歉,不支持 UNICODE(我没有办法测试它……我的 VC++ 版本(入门版 :( )甚至没有编译成 Unicode 模式所需的库……如果有人想这样做,欢迎!)

屏幕截图

样式...

...带动画、用户绘制背景的演示应用程序...

...好吧,这只是某些功能的一个演示。我可没说你的关于对话框必须看起来 *那么* 奇怪。

用法

要使用 Credits 控件,请按照这四个简单的步骤进行

  1. 首先,你需要为你的对话框或窗口类添加一个 `CCreditsCtrl` 类型的变量。不要忘记 `#include` 所需的头文件。
  2. 接下来,调用 `SetDataString` 或 `FormatDataString` 来 设置控件的内容
  3. 如果你想自定义控件的行为和外观,请查看各种 类成员。通常,你会在调用 `Create` 之前调用/设置它们。
  4. 调用 `Create` 函数。

构造

使用以下函数之一来创建 `CCreditsCtrl` 控件

BOOL Create(DWORD dwExStyle, DWORD dwStyle, 
    const RECT& rect, CWnd* pParentWnd,
    UINT nID = 0, UINT nDefaultCursorID = 0, 
    UINT nLinkCursorID = 0);

BOOL Create(DWORD dwExStyle, DWORD dwStyle, 
    UINT nPlaceholderID, CWnd* pParentWnd,
    UINT nID = 0, UINT nDefaultCursorID = 0, 
    UINT nLinkCursorID = 0);

这些函数使用你指定的样式和位置来创建控件

  • `dwExStyle` 定义扩展样式。
  • `dwStyle` 定义控件的窗口样式。
  • `pParentWnd` 是父窗口。
  • `nID` 是控件的子 ID。
  • `nDefaultCursorID` 是光标资源的 ID,或 0 表示默认。
  • `nLinkCursorID` 是鼠标悬停在链接上时使用的光标资源的 ID。0 表示默认。
  • `rect` 是控件的矩形。
  • `nPlaceholderID` 是一个子窗口的 ID,其位置将用于创建窗口。这个在演示中使用。

Content

你使用以下四个函数之一来设置内容

CString SetDataString(LPCTSTR lpszNewString);
CString SetDataString(UINT nStringResourceID);
CString FormatDataString(LPCTSTR lpszFormat, ...);
CString FormatDataString(UINT nFormatID, ...);

它们都返回旧的内容字符串。`SetDataString` 将内部数据字符串设置为 `lpszNewString` 的内容,或设置为 `nStringResourceID` 指定的资源字符串的内容。`FormatDataString` 对内部数据字符串进行与 `CString::Format` 对 `CString` 进行的操作相同的操作...

调用 `FormatDataString(... , ...)` 相当于以下代码片段

CString s;
s.Format(... , ...);
m_wndCreditsCtrl.SetDataString(s);

有关内容应该是什么样的信息,请参考 语言 部分。

背景

你有两种选择来绘制控件的背景

  • 如果你只需要一个单色背景,你可以让 `CCreditsCtrl` 来绘制;你只需使用 `SetDefaultBkColor` 函数指定颜色。
  • 另一个选择是通过指定一个负责绘制的(回调)函数来自己绘制背景。

该函数应该这样定义

static void DrawCreditsBackground(CDC *pDC, 
          RECT rect, BOOL bAnimate, DWORD lParam);
  • `pDC` 是指向要绘制的设备上下文的指针。这是一个内存设备上下文,所以你不需要执行比必要的更多的 `BitBlt` 操作。
  • `rect` 是 Credits 控件的客户区矩形。
  • `bAnimate` 是一个标志,表示背景是否应该被动画化……你不必遵守它,但可能会有意外的结果……但先尝试不处理它 :) ..或者查看演示以了解我如何使用它。
  • `lParam` 可以是任何你想要的值;看下面。

假设 `DrawCreditsBackground` 是一个名为 `CAboutDlg` 的类的成员,并且 `m_wndCredits` 是一个 `CCreditsCtrl` 类型的变量,那么你将使用以下代码行来覆盖默认的背景绘制器

...
m_wndCredits.m_pBackgroundPaint = CAboutDlg::DrawCreditsBackground;
m_wndCredits.m_dwBackgroundPaintLParam = <code>dwAnything;
...
m_wndCredits.Create(...);

...其中 `dwAnything` 是 `CAboutDlg::DrawCreditsBackground` 将作为 `lParam` 接收的值。

"语言"

好吧,这并非真正的“语言”……它是一些标记标签,用于告诉集成解析器,格式应该是什么样的。它可以被定义为自定义 HTML 和 XML 规则……这是你下一个头痛的完美组合 :)

好了,我们开始吧……首先是一些基本准则

  • 换行符**不会**被去除,但是建议使用 `
    ` 和 `

    ` 标签(见下文)……谁知道呢,也许会有下一个版本。

  • 与 HTML 不同,空格会保留。
  • 同样,与 HTML 不同,标签参数**必须**用单引号或双引号括起来:`` 或 ``。这很重要!
  • 在需要时,永远、永远不要忘记闭合标签!(见下方的参考)
  • 解析器**不容错**……这意味着如果你犯了格式错误,它*可能会*导致你的程序出错……或者更糟!(然而,你仍然可以犯拼写错误 :))

现在来看标签

就这些!!——没有更多标签了 :-D

如果你在此“语言”中遇到问题,请查看演示或 `CCreditsCtrl::Initialize()` 函数的源代码(不推荐)。如果你仍然无法解决问题或认为它是 bug,请在此处发布。

...尽情享受吧!!

杂项类成员

在这里,我将简要评论一些有用的公共类成员,以防你将来需要它们...

BOOL Create(...); 有关详细说明,请参见 构造
CString SetDataString(...);

设置控件的内容。

返回值:旧内容。

有关更多信息,请参见 内容

CString FormatDataString(...);

设置控件的内容。

返回值:旧内容

有关更多信息,请参见 内容

CString GetDataString(); 返回 `m_sData` 的值,其中包含控件的内容。
int HitTest(CPoint pt); 返回光标下方的链接的索引。可与 `m_HotRects` 和 `m_HotRectActions` 一起使用。如果光标不在链接上,则返回 `-1`。
void SetDefaultBkColor(COLORREF crColor); 设置默认背景绘制器将使用的背景颜色。如果你使用自己的背景绘制器,请不要调用此函数!
void Initialize(); 解析 `m_sData` 的内容并填充 `m_HotRects` 和 `m_HotRectActions`。如果你手动修改 `m_sData`(例如,不调用 `SetDataString` 或 `FormatDataString`),请调用此函数来更新你的更改。
void SetDefaultLinkCursor(); 将链接光标设置为手形光标。我从 Chris Maunder 的 Hyperlink Control 中得到了这个——谢谢!

-- 变量 --

BOOL m_bCanScroll `TRUE` 表示用户应该被允许手动滚动控件内容。
int m_nCurBitmapOffset 当前滚动偏移量……通常你不希望修改它。
int m_nTimerSpeed `SetTimer()` 中使用的速度。改变它以获得更慢/更快的滚动速度。默认值:40
HCURSOR m_hDefaultCursor 默认光标的句柄。如果你不想在 `Create` 函数中使用资源 ID 指定它,可以在调用 `Create` 之后更改此变量。
HCURSOR m_hLinkCursor 与 `m_hDefaultCursor` 相同,但仅在光标位于链接上时使用。
CString m_sData 包含控件内容的字符串。应使用 `SetDataString` 或 `FormatDataString` 进行设置。
CArray<CRect,CRect&> m_HotRects 一个数组,包含所有链接的矩形,相对于内容位图的顶部(而不是客户区矩形)。你不应修改其内容。
CArray<CString,CString&> m_HotRectActions 包含所有链接操作的数组。索引与 `m_HotRects` 的索引匹配。不应修改。
COLORREF m_crInternalTransparentColor

内部用作透明颜色的颜色。用此颜色绘制的任何内容都将是透明的(包括位图和文本)。你可以用它来为图像添加透明效果。

此外,这是字体初始化的颜色(除非你指定了文本背景),所以选择一种颜色,使其尽可能接近实际背景颜色(例如,如果你有一个深色背景,你可以选择 `black` 作为透明颜色,或者 `RGB(1,1,1)` 如果你不希望位图中黑色部分是透明的)。

void(*m_pBackgroundPaint)(CDC*,RECT,BOOL,DWORD)

此变量保存用于背景绘制的(回调)函数的指针。

有关更多信息,请参考 背景 部分。

DWORD m_dwBackgroundPaintLParam 存储在 `m_pBackgroundPaint` 中的函数将作为其第四个参数(`lParam`)接收的值

提示与技巧

  1. 下载演示!
  2. 阅读手册!
  3. 定制 `m_crInternalTransparentColor` 以满足你的需求。
  4. 大多数颜色参数(如果不是全部)都可以接受 `none` 或 `transparent` 的值,这将使它们……透明!
  5. 控件在创建后 `(m_nTimerSpeed*10)` 毫秒开始滚动。如果你想改变这个延迟,请在调用 `Create` 之前修改 `m_nTimerSpeed`,并在之后将其改回。例如,如果你想完全消除延迟,你可以这样做
    ...
    int nOldSpeed = m_wndCreditsCtrl.m_nTimerSpeed;
    m_wndCreditsCtrl.m_nTimerSpeed = 0;
    m_wndCreditsCtrl.Create(...);
    m_wndCreditsCtrl.m_nTimerSpeed = nOldSpeed;
    ...
  6. 在内容的末尾添加大量的 ``...否则,内容的开头将紧跟在结尾之后显示,这通常不是你想要的。
  7. 计算机程序会按照你的指示去做,而不是按照你的意愿去做……这是明智的话 :)
© . All rights reserved.