Windows 7的任务栏上的Delphi表单图标模糊(启用了MainFormOnTaskbar)

Den*_* G. 13 delphi icons taskbar windows-7

我们有一个用Delphi编写的Windows桌面应用程序在Windows 7上工作正常,只是主窗体的图标在Windows的新任务栏中看起来很模糊.只要应用程序尚未启动,图标就会很好(即当它固定在任务栏上时).一旦启动,Windows将使用主窗体的图标(而不是.exe资源图标),并且模糊(看起来像是图标的16x16版本).

我们用于.exe和主窗体的图标完全相同,它包含各种分辨率,包括带有alpha混合的48x48.

我的理论是,当我在Delphi中导入主窗体的.ico文件时,Delphi会忽略/删除图标的额外分辨率.有没有办法防止/解决这个问题?确保用Delphi编写的应用程序在Windows 7任务栏中使用正确的图标分辨率的最佳方法是什么?

Ser*_*yuz 12

问题在于VCL内的懒惰编程不适合OS的行为变化.或多或少是这样的;

TCustomForm.CreateWnd,在创建窗口句柄后调用;

  SendMessage(Handle, WM_SETICON, 1, LPARAM(GetIconHandle)) else
Run Code Online (Sandbox Code Playgroud)

注意"1"代替wParam,即ICON_BIG.实际上VCL设置了表单的大图标.但是图标的请求大小(TIcon.FRequestedSize)是16x16(默认情况下),因此表单的TIcon返回小图标的句柄.这是系统小图标的大小,并在构造函数CreateNew中通过调用GetSystemMetrics确定.

由于早期版本的Windows使用任务栏上的小图标,这没有问题.Hovewer Alt + Tab对话框有其他问题; 如果图标已分配给表单,则在Alt + Tab对话框中显示"模糊".无论如何,Windows 7仍默认为小图标(SM_CXSMICON/SM_CYSMICON)返回16x16,大图标(SM_CXICON/SM_CYICON)返回32x32,但是大任务栏显示大图标,如果有的话...

正确的方法是为大图标分配一个大图像(如果图标中有一个),并为小图标分配一个小图像(如果有的话).当然,由于尺寸不必具有完全匹配,这将需要复杂的算法.相反,实现了更简单但更破碎的设计.


对于解决方法,我没有为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;
Run Code Online (Sandbox Code Playgroud)

并在项目中包含一个带有16x16和32x32图像命名图标的"icons.res".OnCreate调用中的所有表单

 SetFormIcons(Handle, 'MYFORM', 'MYFORM');
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,我发现的解决方案是不为表单设置图标,而且使用应用程序的图标似乎效果更好。我现在将检查它在 Win 7 中的情况。 (2认同)