arrowHome arrow FAQ arrow WinAPI arrow Jak sprawić by okno było przezroczyste Tuesday, 07 September 2010  



 
Google
Web winapi.org
Main Menu
Home
News
FAQ
Links
Download
Kontakt
FORUM

Artykuły
Podstawy
GDI i Multimedia
Kontrolki
inne
Winapi + asm
WinSock
Soft
Login Form
Login

Hasło

Zapamiętaj mnie
Nie pamiętasz hasła?
Nie masz konta? Załóż je sobie
Jak sprawić by okno było przezroczyste Drukuj E-mail
Oceny: / 25
KiepskiBardzo dobry 
Nadesłał Codeguy   
Friday, 23 September 2005

Witam.

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:

//zmienne
typedef BOOL (WINAPI *lpfn) (HWND hWnd, COLORREF cr, BYTE bAlpha, DWORD dwFlags) ;

lpfn g_pSetLayeredWindowAttributes ;

//definicje
HMODULE hUser32 ;

//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 )
< Poprzedni
Dodaj do ulubionych
Ustaw stronę startową
Ostatnio dodane
Popularne
 
top

www.winapi.org © 2003 - 2007