我们有一个使用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');