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)