Значки формы Delphi являются расплывчатыми на панели задач Windows 7 (с включенным MainFormOnTaskbar)

Нам записали настольное приложение Windows в Delphi, который хорошо работает в Windows 7, за исключением того, что значок основной формы выглядит расплывчатым в новой панели задач Windows. Пока приложение не было запущено, значок выглядит хорошо (т.е. когда это прикрепляется к панели задач). После того как это было запущенное использование Windows значок основной формы (вместо .exe значка ресурса), и это расплывчато (это похоже 16x16, версия значка увеличена).

Значок, который мы используем для .exe и для основной формы, является точно тем же, и это содержит все виды разрешений, включая 48x48 с альфа-смешиванием.

Моя теория состоит в том, что Delphi игнорирует/удаляет дополнительные разрешения значка, когда я импортирую .ico файл для основной формы в Delphi. Существует ли способ предотвратить/устранить это? Что лучший способ состоит в том, чтобы гарантировать, что приложение, записанное в Delphi, использует корректное разрешение значка в панели задач Windows 7?

13
задан Dennis G. 12 April 2010 в 11:57
поделиться

2 ответа

Проблема заключается в ленивом программировании в VCL, которое не соответствует изменению поведения ОС. Примерно так:

TCustomForm.CreateWnd после создания дескриптора окна вызывает;

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

Обратите внимание на «1» вместо wParam, это 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;

и включаю "icons.res" »с именованными иконками, имеющими изображения 16x16 и 32x32, в проекте. Все формы в их вызове OnCreate

 SetFormIcons(Handle, 'MYFORM', 'MYFORM');
12
ответ дан 2 December 2019 в 00:17
поделиться

Если все сделать правильно, это может быть кошмаром. Я обнаружил, что наиболее успешной стратегией является размещение очень простого значка в основной форме и приложении, а затем включение программы ReplaceVistaIcon в рабочий процесс сборки для замены значка файлом с несколькими значками после завершения сборки (и перед подписанием exe). Кажется, это правильно размещает значок, так что Windows выбирает его вместо любого другого ресурса значка. Это неудобно, но после настройки (в нашем проекте FinalBuilder) это работает для нас.

Раздражающая проблема, пока вы это тестируете, заключается в том, что вам, возможно, придется удалить кэш значков Windows, чтобы увидеть эффект любых изменений. Это включает в себя закрытие проводника, чтобы вы могли удалить файл кеша из командного сеанса.

3
ответ дан 2 December 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: