【问题标题】:Showing an animated .ani cursor on a form in Delphi 7在 Delphi 7 中的表单上显示动画 .ani 光标
【发布时间】:2022-02-03 02:18:16
【问题描述】:

我的应用程序正在使用单独的线程在后台从数据库中加载列表项。在加载过程中,用户可以与应用程序交互,所以我不想更改默认光标。尽管如此,为了直观地表示加载过程,我想在我的表单上显示 Windows 繁忙(沙漏,IDC_WAIT)光标,就像动画图像一样。最简单的方法是什么?我正在考虑转换为 GIF 并在 GIFImage 中显示,但我想显示默认的 Windows 光标(从而动态地从系统获取资源)。

注意:我使用的是 Delphi7。

【问题讨论】:

  • AFAIK,无法将系统光标转换为动画 GIF。我会改用TAnimate,提供你自己的AVI 资源来玩。您可以下载大量免费软件 AVI,然后将其编译到您的应用程序中。或者,如果你真的想使用TGifImage,有很多免费软件动画 GIF 可供下载。
  • 设置cursor to crAppStart - 这正是它的目的(以及它同时具有:指针等待指示器的原因)。但是现在没有人知道/理解与crHourGlass 的区别(程序员和用户都没有)。

标签: delphi animation delphi-7 mouse-cursor timage


【解决方案1】:

只是部分解决方案:声明变量

h: HICON;
FFrameIdx: Integer;

然后加载光标:

h := LoadImage(0, MakeIntResource(OCR_WAIT), IMAGE_CURSOR, 0, 0, LR_SHARED);

然后在OnPaint处理程序中绘制当前帧:

DrawIconEx(Canvas.Handle, 100, 100, h, 0, 0, FFrameIdx, 0, DI_NORMAL);

要对其进行动画处理,您可以使用 TTimer 和以下代码:

Inc(FFrameIdx);
Invalidate; // or something more suitable

要试试这个,你可以把变量放在一个新的 VCL 应用程序的主窗体类中(在private 下方),将LoadImage 放在窗体的OnCreate 处理程序中,将DrawIconEx 放在OnPaint 中处理程序。

但如果你想在真正的应用程序中使用它,你最好用它创建一个新的自定义控件。

显然,您需要将FFrameIdx 替换为FFrameIdx mod FFrameCount 或将Inc(FFrameIdx) 替换为FFrameIdx := Succ(FFrameIdx) mod FFrameCount,其中FFrameCount 是动画光标中的帧数。

您还应该设置计时器的Interval 以匹配光标的帧速率。

【讨论】:

  • 我不告诉你如何获得FFrameCount 的原因是我不知道没有Win32 API 可以为你提供这些信息!一个快速的 WWW 搜索告诉我看看 FFrameIdxDrawIconEx 失败的地方,但这对我来说似乎不是一个好方法。
  • 无论如何,我都不会尝试加载系统的等待光标并使用它。相反,我会使用我自己的代码制作的动画来创建我自己的自定义控件。当然,这不是系统默认的等待光标,但另一方面,将系统光标显示为图像可能会使用户感到困惑。 (嘿!我有两个鼠标光标!哪个是真实的?)此外,使用“自定义代码”方法可以更轻松地管理 DPI 缩放和无闪烁绘图。您可以完全控制。
  • 您说得非常好,有两个光标确实可能会使用户感到困惑。我还没想过。
猜你喜欢
  • 2017-07-25
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
相关资源
最近更新 更多