Windows 7 的任务栏上的 Delphi 表单图标模糊(启用 MainFormOnTaskbar)
Posted
技术标签:
【中文标题】Windows 7 的任务栏上的 Delphi 表单图标模糊(启用 MainFormOnTaskbar)【英文标题】:Delphi form icons are blurry on Windows 7's taskbar (with MainFormOnTaskbar enabled) 【发布时间】:2011-02-06 23:40:59 【问题描述】:我们有一个用 Delphi 编写的 Windows 桌面应用程序,它在 Windows 7 上运行良好,只是主窗体的图标在 Windows 的新任务栏中看起来很模糊。只要应用程序尚未启动,图标看起来就很好(即当它固定到任务栏时)。一旦启动,Windows 就会使用主窗体的图标(而不是 .exe 资源图标)并且它是模糊的(看起来像是放大了 16x16 版本的图标)。
我们用于 .exe 和主窗体的图标完全相同,它包含各种分辨率,包括 48x48 和 alpha 混合。
我的理论是,当我在 Delphi 中导入主窗体的 .ico 文件时,Delphi 会忽略/删除图标的额外分辨率。有没有办法防止/解决这个问题?确保用 Delphi 编写的应用程序在 Windows 7 任务栏中使用正确图标分辨率的最佳方法是什么?
【问题讨论】:
【参考方案1】:问题在于 VCL 中的惰性编程不适合操作系统的行为变化。或多或少是这样的;
TCustomForm.CreateWnd,窗口句柄创建后,调用;
SendMessage(Handle, WM_SETICON, 1, LPARAM(GetIconHandle)) else
注意 wParam 的“1”,即 ICON_BIG。实际上,VCL 设置了表单的大图标。但是图标的请求大小 (TIcon.FRequestedSize) 是 16x16(默认情况下),因此表单的 TIcon 返回小图标的句柄。这是系统小图标的大小,在构造函数 CreateNew 中通过调用 GetSystemMetrics 确定。
由于早期版本的 Windows 使用任务栏上的小图标,这没有问题。但是 Alt+Tab 对话框有其他问题;如果将图标分配给表单,则它在 Alt+Tab 对话框中显示为“模糊”。无论如何,Windows 7 仍然默认返回 16x16 的小图标 (SM_CXSMICON/SM_CYSMICON) 和 32x32 的大图标 (SM_CXICON/SM_CYICON),但是大任务栏显示大图标,如果有的话..
正确的方法是为大图标分配一张大图(如果图标中有一张),并为小图标分配一张小图(如果有的话)。当然,由于大小不必完全匹配,因此这需要复杂的算法。取而代之的是,实现了一个更简单但被破坏的设计。
作为一种解决方法,我没有为 OI 中的表单分配图标,而是使用它;
procedure SetFormIcons(FormHandle: HWND; SmallIconName, LargeIconName: string);
var
hIconS, hIconL: Integer;
begin
hIconS := LoadIcon(hInstance, PChar(SmallIconName));
if hIconS > 0 then begin
hIconS := SendMessage(FormHandle, WM_SETICON, ICON_SMALL, hIconS);
if hIconS > 0 then
DestroyIcon(hIconS);
end;
hIconL := LoadIcon(hInstance, PChar(LargeIconName));
if hIconL > 0 then begin
hIconL := SendMessage(FormHandle, WM_SETICON, ICON_BIG, hIconL);
if hIconL > 0 then
DestroyIcon(hIconL);
end;
end;
并在项目中包含具有 16x16 和 32x32 图像的命名图标的“icons.res”。 OnCreate 调用中的所有表单
SetFormIcons(Handle, 'MYFORM', 'MYFORM');
【讨论】:
有趣,因为我发现的解决方案是不为表单设置图标,使用应用程序的图标似乎效果更好。我现在将检查它在 Win 7 中的情况。 @mj2008 - 您的解决方案也适用于 W7。我忽略了丹尼斯提到他为应用程序和表单分配了相同的图标。在这种情况下,这将是更简单的解决方案。仅当需要为表单分配不同的图标时,我的解决方法才有意义。 自从 OP 和回答以来已经很久了,但我想指出,这个解决方案似乎不适用于使用 VCL 样式的人。关闭样式并且解决方案有效。 要修复 VCL 样式,请参阅 ***.com/questions/10257353/… @spurgeon - 感谢您的链接。【参考方案2】:要做到这一点可能是一场噩梦。我发现最成功的策略是在主窗体和应用程序上放置一个非常简单的图标,然后将 ReplaceVistaIcon 程序合并到构建工作流程中,在构建完成后用您的多图标文件替换图标(并且在签署 exe 之前)。这似乎可以正确放置图标,以便 Windows 优先于任何其他图标资源来选择它。不得不这样做很麻烦,但是一旦设置(在我们的 FinalBuilder 项目中)它就对我们有用。
在您对此进行测试时,烦人的问题是您可能必须删除 Windows 图标缓存才能查看任何更改的效果。这涉及关闭资源管理器以允许您从命令会话中删除缓存文件。
【讨论】:
+1 感谢或建议,如果 Sertac 的方法效果不佳,我们会使用它。以上是关于Windows 7 的任务栏上的 Delphi 表单图标模糊(启用 MainFormOnTaskbar)的主要内容,如果未能解决你的问题,请参考以下文章