Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Проблема с загрузкой иконки для формы из файла


Автор: navrocky 24.10.2008, 14:21
Не могу по нормальному загрузить иконку в заголовок формы из файла. Сделал иконку, состоящую из икон разного размера (16,32,48,64) 32бита + альфа канал.  
Сперва делал так:
Код
Icon := TIcon.Create;
try
  Icon.LoadFromFile(IconFile); 
  MyMainForm.Icon.Assign(Icon);
  Application.Icon.Assign(Icon);
finally
  Icon.Free;
end;

Но иконка загружается по уродски размером в 16x16 точек, без прозрачности.

Далее делал так:

Код
IconH := LoadImage(0, PChar(IconFile), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE or LR_LOADFROMFILE);
try
  MyMainForm.Icon.Handle := CopyIcon(IconH);
  Application.Icon.Handle := CopyIcon(IconH);
finally
  DestroyIcon(IconH);
end;


Загружается уже с прозрачностью, но стандартного размера 32x32, и в заголовке формы и на тулбаре выглядит уродливо, а по Alt+Tab нормально.

Указываешь явно размер, тогда по Alt+Tab начинает масштабироваться из 16x16 в 32x32, также некрасиво:
Код
IconH := LoadImage(0, PChar(IconFile), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);


Что делать? MSDN пока не помог...  smile 

Автор: Rrader 6.11.2008, 16:04
Как-нибудь так:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Icon: HIcon;
begin
  Icon := LoadImage(0, PChar(IconFile), IMAGE_ICON,
    GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
    LR_LOADFROMFILE);
  try
    SendMessage(Handle, WM_SETICON, 1, Icon);
    SendMessage(Application.Handle, WM_SETICON, 1, Icon);
  finally
    DestroyIcon(Icon);
  end;
  Icon := LoadImage(0, PChar(IconFile), IMAGE_ICON, 0, 0,
    LR_DEFAULTSIZE or LR_LOADFROMFILE);
  try
    SetClassLong(Application.Handle, GCL_HICON, Icon);
  finally
    DestroyIcon(Icon);
  end;
end;

Автор: navrocky 6.11.2008, 17:23
Цитата(Rrader @ 6.11.2008,  16:04)
Код

  try
    SendMessage(Handle, WM_SETICON, 1, Icon);

Спасибо, вроде работает, хотя мудрено как-то. Цитируемая строка почему-то не сработала, пришлось заменить на
Код
FMainForm.Icon.Handle := CopyIcon(IconH);

Автор: Rrader 6.11.2008, 17:36
Цитата(navrocky @  7.11.2008,  00:23 Найти цитируемый пост)
Цитируемая строка почему-то не сработала, пришлось заменить на

С чего бы это? Не скомпилировалось?

А вообще, код я взял из VCL. С сохранением всей логики.

Автор: navrocky 7.11.2008, 16:00
Скомпилировалось, но не менялась иконка у формы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)