Windows 7的任务栏(启用了MainFormOnTaskbar)的Delphi窗体图标模糊

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

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

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

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

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

SendMessage(Handle,WM_SETICON,1,LPARAM(GetIconHandle)) else

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

由于早期版本的Windows使用任务栏上的小图标,这是没有问题的. Hovewer Alt选项卡对话框有其他方面的问题;如果一个图标被分配给一个表单,它在“Alt”选项卡对话框中显示为“模糊”.无论如何,Windows 7仍然默认为小图标(SM_CXSMICON / SM_CYSMICON)返回16×16,而对于大图标(SM_CXICON / SM_CYICON)则返回32×32,但是如果有的话,大型任务栏会显示大图标.

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

对于解决方法,我不分配一个图标到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,ICON_SMALL,hIconS);
    if hIconS > 0 then
      DestroyIcon(hIconS);
  end;
  hIconL := LoadIcon(hInstance,PChar(LargeIconName));
  if hIconL > 0 then begin
    hIconL := SendMessage(FormHandle,ICON_BIG,hIconL);
    if hIconL > 0 then
      DestroyIcon(hIconL);
  end;
end;

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

SetFormIcons(Handle,'MYFORM','MYFORM');

相关文章

文章浏览阅读2.2k次,点赞6次,收藏20次。在我们平时办公工作...
文章浏览阅读1k次。解决 Windows make command not found 和...
文章浏览阅读3.2k次,点赞2次,收藏6次。2、鼠标依次点击“计...
文章浏览阅读1.3w次。蓝光版属于高清版的一种。BD英文全名是...
文章浏览阅读974次,点赞7次,收藏8次。提供了更强大的功能,...
文章浏览阅读1.4w次,点赞5次,收藏22次。如果使用iterator的...