[WinAPI] LoadImage() problem

0

Mam problem z funkcją LoadImage(). Jako ostatni parametr można jej podać LR_LOADTRANSPARENT i wtedy funkcja ma pobrać kolor lewego górnego piksela i zamienić wszystkie o tym kolorze na kolor formy, czyli taka jakby przezroczystość.
Wywołuję to tak:

HBITMAP obrazek;
obrazek=(HBITMAP)LoadImage(hInstance,"c:\\obrazek.bmp",IMAGE_BITMAP,32,32,LR_LOADTRANSPARENT);

Potem sobie go wyświetlam na guziku za pomocą SendMessage() no i niestety razem z tłem.
Siedzę na Windowsie XP, manifest mam dołączony, nie wiem co może być nie tak.. :-/

0

to ta flaga zmienia ci jedynie te piksele na kolor tła, zero przezroczystości...
jeśli chcesz zrobić to co piszesz użyj TransparentBlt, a w ostatnim parametrze podajesz kolor który rzeczywiście nie będzie skopiowany przy rysowaniu

@up
a ładujesz go w przycisk,
no to pewnie tam jest rysowany przez BitBlt, czyli to g**no ci da,

albo własny przycisk musisz zrobić, albo przynajmniej supclassing zastosować

0

Bitmapę maluj (TransparentBlt) w obsłudze komunikatu WM_PAINT buttona (subclassing):

//po stworzeniu buttona
StaraWndProcButtona = (WNDPROC) SetWindowLong(hButton, GWL_WNDPROC, (LONG)NowaWndProcButtona);

//...
LRESULT CALLBACK NowaWndProcButtona(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   switch(msg)
   {
   case WM_PAINT:
      StaraWndProcButtona(hWnd, msg, wParam, lParam);
      HDC hDCButtona = GetDC(hWnd);
      TransparentBlt(hDCButtona, ...);
      ReleaseDC(hDCButtona);
      break;

   default:
      return StaraWndProcButtona(hWnd, msg, wParam, lParam);
   }

   return 0;
}

Żeby nie malować za każdym razem całej bitmapy a tylko potrzebny fragment to w obsłudze WM_PAINT sprawdź jaki obszar buttona musi być odmalowany (GetUpdateRect) i tylko tam maluj bitmapę.

0

No ok, wiem że to nie przezroczystość. Ale daje podobny efekt. W tutorialu na darkcult.republika.pl w rozdziale o menu koleś używa takiego ładowania bitmapy do dodania obrazka do menu i ładnie mu tam niby działa.
Nie da się tego zastosować do zwykłego buttona?

0

Jak masz włączone style XP to przecież tło buttona nie ma koloru formy ani nie jest jednolite więc tylko TransparentBlt.

0

Kurcze, siedzę nad tym już tyle godzin i wciąż nie mogę:/ Czytałem już nie wiem ile o tym superclassingu i o gdi, a jedyne co udało mi się zrobić to popsuć klasę guzików jak dotąd...
Byłby ktoś tak miły i w wolnej chwili skrobnął ten kawałek kodu? Bardzo mi na tym zależy...

0

Może użyj stylu BS_ICON i wstaw ikonę na button (BM_SETIMAGE). Ikony mogą mieć dowolny rozmiar oraz to co cię interesuje - piksele przezroczyste.

0

Tak? Ikony mają przezroczystość jak png? Tylko problem w tym, że chyba nie da się stworzyć ikony w kształcie prostokąta...
Bo to wszystko jest po to żeby na przycisku umieścić grafikę i tekst. A, że nie da się bez modyfikowania kontrolek (w msdnowsim sposobie z SendMEssage jest bug i nie działa to na Windows XP) to wymyśliłem, że stworzę grafikę z napisem i obrazkiem, ale tu jest ta przezroczystość potrzebna :-/

0

Przepraszam, mój błąd: Da się stworzyć ikony w niestandardowych rozmiarach. To pomogło, wielkie dzięki! :)

0

Ajj, 3 posty pod sobą, ale bez konta nie da się edytować...
Radość była krótkotrwała, po dodaniu stylu BS_IMAGE do przycisku, nie działa na nim styl XP.
Znaczy tak jakby na niego nie działał manifest. Wszystko wygląda ładnie, okrągło a ten jeden kwadratowy ;p

Manifest dodaję tak:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")

Może niezbyt dobry sposób, ale jedyny który mi działa spośród sprawdzanych.

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