Durne DrawState i ikony

0

Ostatnio zmagam się z tym, aby mieć 32 bitowe ikony w menu - niestety TImageList nie obsługuje takich ikon... umie je załadować, ale kanał alpha zanika, przez co ikony w menu mają brzydką poszarpaną białą obwódkę.

Co za tym idzie, trzeba kompletnie przepisać rysowanie elementów menu, ale to nie problem - tą część już mam zrobioną, zostało mi tylko dorobić rysowanie check/radio oraz to co najważniejsze - rysowanie ikon w nieaktywnym menu. O ile tekst szybko i fajnie rysuje się za pomocą DrawState to z ikonami już jest inaczej - ikony nieaktywne w ogóle się nie rysują, a aktywne zamiast 16x16 mają 32x32 px. Ikony ładuję z zasobów do tablicy TIcon, wszystkie ikony mają tylko 1 format 16x16px.

DrawIcon(ACanvas.Handle, ARect.Left + 2, ARect.Top + 2,Icons[Sender.ImageIndex].Handle );

DrawIconEx(ACanvas.Handle, ARect.Left + 2, ARect.Top + 2, Icons[Sender.ImageIndex].Handle, 16, 16, 0, 0, DI_NORMAL);

DrawState(ACanvas.Handle, 0, nil, Icons[Sender.ImageIndex].Handle, 0, ARect.Left + 2, ARect.Top + 2, 16, 16, Flags or DST_ICON);

DrawIcon maluje ikonę, ale 32x32px :/ Nie wiem czemu skoro ona jest 16x16px.
DrawIconEx maluje ikonę tak jak trzeba (w końcu ma na chama podane 16x16px), ale nie ma możliwości narysowania nieaktywnej ikony.
DrawState kompletnie ignoruje parametry rozmiaru i maluje ikonę tylko jeżeli w Flags nie ma DSS_DISABLED. Czyżby ta funkcja nie obsługiwała operacji graficznych na 32 bitowych ikonach?

Jedyne rozwiązanie jakie mi się nasuwa to utworzyć oddzielne ikony dla aktywnych i nieaktywnych, ale to trochę mozolne będzie :/ Może jednak ktoś ma jakiś pomysł na tego DrawState?

0

Mozna zmusic aby obslugiwala

var
IL: TImageList;
begin
IL := TImageList.Create(nil); //moze jako komponenty byc ....
//ewentualnie dodac obrazki
IL.Handle := ImageList_Create(IL.Width, IL.Height, ILC_COLOR32 or ILC_MASK, 0, IL.AllocBy);
end;

0

Sprawdzałem to już i co z tego, że jest w FAQ i niby działa, skoro i tak nieaktywne ikonki wyglądają jak g... Dla przykładu jedna ikonka to niebieskie kółeczko z białą ramką, a w środku znak zapytania, całość z lekkim blendem na krawędzi, aby ładnie pasowało do dowolnego tła, wszystko cacy, ale gdy element menu stanie się nieaktywny to z ikony pozostaje tylko prawy dolny kawałek krawędzi kółka, ale za to szary i wycieniowany.

0

Mam dokładnie ten sam problem (choć w c++).
Ikony wyświetlają się tylko jeżeli ustawione są flagi DST_ICON | DSS_NORMAL.
Wszystkie inne flagi (DSS_UNION, DSS_DISABLED) powodują że ikona jest niewidoczna ( mam gradient w tle i właściwie nic nie widać, może są tam jakieś cienie).

1
pzerone napisał(a):

Mam dokładnie ten sam problem (choć w c++).
Ikony wyświetlają się tylko jeżeli ustawione są flagi DST_ICON | DSS_NORMAL.
Wszystkie inne flagi (DSS_UNION, DSS_DISABLED) powodują że ikona jest niewidoczna ( mam gradient w tle i właściwie nic nie widać, może są tam jakieś cienie).

Chciałeś się pochwalić problemem? Super.

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