[Winapi] Pokazanie ikon systemowych w rozmiarze 16x16

0

Mam taki prosty kod:

var Icon:HIcon;
begin
Icon:=LoadImage(0, MAKEINTRESOURCE(OIC_WARNING), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR or LR_SHARED);
DrawIcon(Canvas.Handle, 10, 10, Icon);
DestroyIcon(Icon);
end;

Prosty, ale nie działa jak trzeba, bo bez względu na to, jaki rozmiar ikony w LoadImage podam, zawsze otrzymuję ikonę systemową 32x32.

A przecież,

MSDN napisał(a)

cxDesired
[in] Specifies the width, in pixels, of the icon or cursor. If this parameter is zero and the fuLoad parameter is LR_DEFAULTSIZE, the function uses the SM_CXICON or SM_CXCURSOR system metric value to set the width. If this parameter is zero and LR_DEFAULTSIZE is not used, the function uses the actual resource width.
cyDesired
[in] Specifies the height, in pixels, of the icon or cursor. If this parameter is zero and the fuLoad parameter is LR_DEFAULTSIZE, the function uses the SM_CYICON or SM_CYCURSOR system metric value to set the height. If this parameter is zero and LR_DEFAULTSIZE is not used, the function uses the actual resource height.

W dodatku ikony systemowe na pewno mają swoje małe rozmiary - bez problemu można ustawić je formie czy innym elementom.

Czy spotkał się ktoś z takim problemem lub wie jak go rozwiązać?

0

Zastosuj funkcje

DrawIconEx

0

Dzięki. Ja jednak nie szukam odpowiedzi na pytanie, jak narysować małą ikonkę, bo to umiem, ale raczej: dlaczego powyższy kod nie działa?

Chcę się po prostu dowiedzieć, po jaką cholerę LoadImage ma czwarty i piąty parametr - wymiary; gdyby help nie opisywał ich zastosowania przy ikonach i kursorach zrzuciłbym to na barki bitmap, ale skoro opisuje, to po coś to jest. Tylko po co?

0

Ja stawiam na to, ze jest to przydatne w momecie kiedy laduje sie takie ikonki do listy a pozniej wyswietla w listach (TreeView, ListView), oraz w przypadku np. dodawania ikonki do traya.

0

Z trayem też próbowałem - nie widzę absolutnie żadnej różnicy.

0

Nie wiem kiedy to bylo - ne jestem wstanie sobie przypomniec, ale wiem ze kiedys ta opcja poprawila wyglad ikonki chyba chodzilo o liste.

Tym bardziej ikony systemowe z LD_SHARED moga byc od razu ladowane w wielu wymiarach ale taki kod juz daje roznice

var
  Icon,i1:HIcon;
begin
Icon := LoadImage(Hinstance, 'MAINICON', IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR );
I1 := LoadImage(Hinstance, 'MAINICON', IMAGE_ICON, 64, 64, LR_DEFAULTCOLOR );
DrawIconEx(Canvas.Handle, 50, 10, Icon,64,64,0,0,DI_NORMAL);
DrawIconEx(Canvas.Handle, 250, 10, I1,64,64,0,0,DI_NORMAL);
DestroyIcon(Icon);
DestroyIcon(I1);
end;
0

No właśnie robi, ale tylko w przypadku ikon niesystemowych - przy tych drugich nie ma różnicy, ale przeglądając zasoby plików systemowych widać, że ikonki są w różnych rozmiarach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1