Ответ 1
Проблема заключается в ленивом программировании в VCL, не соответствующем поведенческой смене ОС. Более или менее это так:
TCustomForm.CreateWnd, после создания дескриптора окна, вызывает
SendMessage(Handle, WM_SETICON, 1, LPARAM(GetIconHandle)) else
Обратите внимание на "1" вместо wParam, это ICON_BIG. Фактически VCL устанавливает большой значок формы. Но запрошенный размер значка (TIcon.FRequestedSize) равен 16x16 (по умолчанию), и поэтому TIcon формы возвращает дескриптор маленькой иконки. Это размер для маленькой иконки системы и определяется в конструкторе CreateNew с вызовами GetSystemMetrics.
Поскольку более ранние версии Windows использовали маленький значок на панели задач, это не было проблемой. У Hovewer диалог 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;
и включите в проект значок icons.res с именованными значками с изображениями 16x16 и 32x32. Все формы в вызове OnCreate
SetFormIcons(Handle, 'MYFORM', 'MYFORM');