问题在于 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');