Minięło wiele lat od wydania pierwszego Windowsa. Jednak dopiero wersje 2000 i XP mogą wyświetlać przezroczyste okna. Hmm...nie będziemy wnikać tu w poziom inteligencji pracowników Microsoftu - okna jak okna przezroczyste być powinny (no chyba, że się nie myje...).
Aby nasze okno było normalne, czyli przezroczyste (:P) musimy wywołać funkcję SetLayeredWindowAttribute. Jednak jest to tzw. nieudokumentowana funkcja i nie ma pliku nagłówkowego, który umożliwiałby nam korzystanie z niej. W tym przypadku musimy wyciągnąć ją z pliku User.dll na przykład podczas zdarzenia WM_CREATE. Potem w CreateWindowEx podajemy pierwszy parametr - WS_EX_LAYERED (gdyby kompilator nie znalazł tej definicji to napisz na początku pliku: #define WS_EX_LAYERED 0x00080000). Teraz wypadałoby poznać parametry naszej wspaniałej funkcji. Oto one:
HWND hWnd - uchwyt okna na którym funkcja ma działać COLORREF cr - kolor który będzie kluczowany (w przypadku gdy dwFlags wynosi 1) BYTE bAlpha - intensywność przezroczystośći (tzw. kanał alpha [w przypadku gdy dwFlags wynosi 2] przyjmuje wartości od 0 do 255 - BYTE) DWORD dwFlags - przyjmuje wartości 1 (kluczowanie kolorów okna), 2 - (kanał Alpha, taka fajna przezroczystość :D)
Dobrze zdefiniować sobie te wartości 1 i 2 jako:
#define LWA_COLORKEY 1 #define LWA_ALPHA 2
Nie jest to konieczne, ale... ;)
Teraz zajmijmy się pobraniem funkcji SetLayeredWindowAttribute. Oto przykładowy kod:
//część instrukcji switch WM_CREATE: case WM_CREATE: hUser32 = GetModuleHandle("USER32.DLL") ; g_pSetLayeredWindowAttributes = (lpfn)GetProcAddress(hUser32, "SetLayeredWindowAttributes") ; if(g_pSetLayeredWindowAttributes == NULL) MessageBox (hwnd, "Przezroczystość nie jest dostępna w tej wersji Windowsa :(", "Niestety", MB_ICONEXCLAMATION) ; break ;
Najpierw należy utworzyć wskaźnik na naszą funkcje. Przedtem jednak piszemy sobie typ (wskaźnikowy) czyli BOOL (WINAPI *lpfn) oraz określamy paramtery funkcji: (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags).
Na początku WM_CREATE pobieramy uchwyt do biblioteki USER32.DLL. Potem importujemy z niej odpowiednią funkcje (jak widzisz przydaje się przedtem zdefiniowany typ wskaźnikowy [tak ten, który rzutujemy ;)]). Sprawdzamy czy wskaźnik do funkcji nie jest przypadkiem pusty - jeśli tak to znaczy, że wersja windowsa nie pozwala na korzystanie z przezroczystości.
Teraz pozostaje tylko (na przykład po wywołaniu ShowWindow) użyć funkcji:
//kluczuje kolory czyli nie wyświetla koloru zdefionowanego w drugim parametrze g_pSetLayeredWindowAttributes(hwnd, RGB(212, 208, 200), 0, LWA_COLORKEY) ;
//ustawia przezroczystość na 170 g_pSetLayeredWindowAttributes(hwnd, 0, 170, LWA_ALPHA) ;
Jeśli nie rozumiesz różnicy w zastosowaniu LWA_ALPHA i LWA_COLORKEY to po prostu przetestuj obie metody :D (wiem, to było chamskie :P)
Pozdrawiam (jak macie jakieś pytania to piszcie)
Ostatnia aktualizacja ( Monday, 14 November 2005 )