启用主题的 Windows XP/Vista 中的 TAnimate 将不起作用 [关闭]

Posted

技术标签:

【中文标题】启用主题的 Windows XP/Vista 中的 TAnimate 将不起作用 [关闭]【英文标题】:TAnimate in Windows XP/Vista with themes enabled won't work [closed] 【发布时间】:2010-11-17 08:18:25 【问题描述】:

多年来,一位同事一直在使用自定义 AVI 来指示一些较长时间的操作的进度。它总是运行良好。

最近他决定从 Delphi 7 迁移到 Delphi 2007,部分原因是为了获得对其应用程序的主题支持。 (我们终于让大多数人,但不是所有人都在 XP 上运行。)动画停止工作。禁用主题使其再次工作。

TAnimate 是使用 InitCommonControlsEx(ICC_ANIMATE_CLASS) 创建的 Windows 动画控件的包装器。 MSDN 文档说“如果您使用的是 ComCtl32.dll 版本 6,则不支持该线程,因此请确保您的应用程序不会阻塞 UI,否则动画将不会出现。”显然,这是预期的行为。

有没有人对这个问题的解决方法或替代方案提出建议?他试图显示进度的处理并不适合产生一个单独的线程,并且由于显而易见的原因 Application.ProcessMessages 也不是一个好的解决方案。

编辑:我将这个问题的正确答案授予 Rob Kennedy,因为 a) 他为 Raymond Chen 关于该主题的博客文章提供了“缺失的链接”(双关语),b) 因为当然要将事情转移到一个单独的线程是正确的答案。

这里具有讽刺意味的是:他正在执行的阻止 TAnimate 的操作是我们使用的数据库引擎(Advantage Database Server,或 ADS)的索引操作。当他带着问题来找我时,他没有提到这一点。

ADS 支持使用 TAdsDataSet.AdsRegisterCallbackFunction 和 TAdsDataSet.AdsClearCallbackFunction 方法的进度回调。回调函数既提供当前操作的进度(以百分比表示),又提供通过函数返回值取消操作的方法。所以整个问题都没有实际意义。回调函数可用于更新进度条,向用户指示应用未挂起。

【问题讨论】:

从 7 移动到 2007 以获得主题?我虽然 Delphi 7 已经支持主题。 我确实说过“部分”。 D7 确实支持主题;他只是没有注意到。 (他有点像卢德分子。 【参考方案1】:

Raymond Chen has written about this. 他甚至没有提到我通常认为的线程控件无法正常工作的主要原因,即线程不应该在与不同线程关联的窗口上绘图。

我鼓励你的同事重新审视让他决定不能将任务放到单独线程中的任何事情。阻塞主 UI 线程根本不是一个好主意,不管那里是否有动画控件来掩盖无响应。

【讨论】:

罗布,谢谢。我知道我在某处看到了一些东西,但是 MSDN 搜索并没有找到 Raymond 的文章。他仍然不同意单独的线程是唯一的解决方案(他正在等待调用第三方 DLL,并且在该 DLL 任务完成之前,他的应用程序应该无法继续)。他只是想在此过程中显示某种活动指示器,以便用户知道应用程序没有被冻结。【参考方案2】:

作为 TThreads 的替代方案,您可以使用AsyncCalls,它从功能的角度提供了一个更容易进入多线程处理的入口点。尽管如此,处理这个问题的最佳方法是在后台执行长时间的过程以保持应用程序的响应。

【讨论】:

以上是关于启用主题的 Windows XP/Vista 中的 TAnimate 将不起作用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 win xp Vista 和 Windows 7 上保存程序数据的位置

获取 XP、Vista 和 7 的 windows 序列号

Windows XP 与 Vista/7 上的 MS Crypto API 行为

我如何在 Windows(xp、vista、7)欢迎屏幕或锁定屏幕(如 VNC 或 Dame Ware)中进行交互

Java (+- JNA) 中有没有办法在 XP+Vista+Windows 7 中可靠地设置主系统音量?

Windows XP/Vista/Win7 的免费 DNS 服务器? [关闭]