Upscaling małych ikon nigdy nie jest dobrym pomysłem. Ikona 16X16 jest za mała, aby używać jej w jakikolwiek inny sposób, tak jak jest.
Na początek można dostać większe obrazy powłoki stosując
ImageList.Handle:=SHGetFileInfo('',0,FileInfo,SizeOf(FileInfo),SHGFI_SYSICONINDEX or SHGFI_ICON);
tych obrazów będzie generalnie 32x32 pix, ale być na bezpiecznej stronie (jeśli system Windows jest uruchomiony w trybie wysokiej dpi) można uzyskać odpowiedni rozmiar od System
uses
Winapi.Windows;
var
IconWidth, IconHeight: integer;
IconWidth := GetSystemMetrics(SM_CXICON);
IconHeight := GetSystemMetrics(SM_CYICON);
można również uzyskać nawet większe obrazy powłoki z SHGetImageList
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762185%28v=vs.85%29.aspx
Aby przywrócić ikonę fro m ty ImageList (jeśli ImageList zawiera ikony, aw twoim przypadku to robi) można użyć:
ImageList.GetIcon(Index: Integer; Image: TIcon);
do skalowania ikon, przy jednoczesnym zachowaniu przejrzystości, do niestandardowych wymiarów można użyć następującego kodu:
procedure StretchDrawIcon(Canvas: TCanvas; Dest: TRect; Icon: TIcon);
begin
DrawIconEx(Canvas.Handle, Dest.Left, Dest.Top, Icon.Handle, Dest.Right - Dest.Left, Dest.Bottom - Dest.Top, 0, 0, DI_NORMAL);
end;
Czy nie może być 2 piksele mniejsze? 48 x 48 pikseli? – TLama
Nie, powiedziałem na przykład 50, ale chcę, aby możliwe było skalowanie do dowolnej wielkości. –
Lepiej uzyskaj rozmiar 48 x 48 lub większy i skaluj go, zamiast rozciągać od 16x16 do 50x50. w każdym przypadku używasz 'ImageList.GetBitmap' i robisz to, co chcesz. lub jeszcze lepiej uzyskać od niego uchwyt Icon i użyć ['DrawIconEx'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648065 (v = vs.85) .aspx) – kobik