Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Obrazek z przezroczystością jako okno aplikacji

Ostatnio zmodyfikowano 2021-05-10 22:04
Autor Wiadomość
megusta
Temat założony przez niniejszego użytkownika
Obrazek z przezroczystością jako okno aplikacji
» 2021-05-08 15:21:49
Witam,
Jest to stara aplikacja napisana w winapi c++, potrzebuje jako tło okna aplikacji ustawić obraz png z przezroczystością. Jeśli zrobię konwert png do bmp 28 bit to owszem działa lecz wiadomo nie ma przezroczystości dookoła tła aplikacji lecz białe tło. Gdy zrobię konwert do bmp 32bit rgba wtedy tło się nie ładuje. Całe okno jest przezroczyste jedynie widać kontrolki. Jest możliwość wyświetlić bezpośrednio png jako tło okna albo chociaż bmp 32 z kanałem alfa? Proszę o pomoc/nakierowanie. Okno tworzę tak, IDB_BG to właśnie moje tło w bmp 32bit:
C/C++
bool InitApplication( HINSTANCE hinstance )
{
   
//HBITMAP hbmp = LoadBitmap(hinstance, MAKEINTRESOURCE(IDB_BG));
   
HBITMAP hbmp =( HBITMAP ) LoadImage( hinstance, MAKEINTRESOURCE( IDB_BG ), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
   
HBRUSH hbr = CreatePatternBrush( hbmp );
   
   
WNDCLASSEX wcx;
   
   
wcx.cbSize = sizeof( wcx );
   
wcx.style = CS_HREDRAW | CS_VREDRAW;
   
wcx.lpfnWndProc = AppWndProc;
   
wcx.cbClsExtra = 0;
   
wcx.cbWndExtra = 0;
   
wcx.hInstance = hinstance;
   
wcx.hIcon = LoadIcon( hinstance, MAKEINTRESOURCE( IDI_ICON ) );
   
wcx.hCursor = LoadCursor( NULL, IDC_ARROW );
   
wcx.hbrBackground = hbr;
   
wcx.lpszMenuName = NULL;
   
wcx.lpszClassName = szWindowClass;
   
   
return RegisterClassEx( & wcx );
}
dodatkowo dalsza czesc kodu:
C/C++
hwnd = CreateWindow(
szWindowClass,
0,
( WS_BORDER ),
0,
0,
475,
323,
( HWND ) NULL,
( HMENU ) NULL,
hinstance,
( LPVOID ) NULL
);

SetWindowLong( hwnd, GWL_STYLE, GetWindowLong( hwnd, GWL_EXSTYLE ) | WS_EX_LAYERED );
SetWindowPos( hwnd, 0, ScreenX, ScreenY, 475, 323, SWP_FRAMECHANGED );
Bardzo bym prosił o pomoc :) Pozdrawiam!
P-178557
pekfos
» 2021-05-08 16:34:55
P-178558
megusta
Temat założony przez niniejszego użytkownika
» 2021-05-09 10:45:15
Cześć, dzięki za szybką odpowiedz.
Niestety to raczej mi nie pomoże.
Dla przykładu jakiś launcher pewnej gry odpalony na pulpicie.

https://gyazo.com/98236abfded2831e5c4543196ce43b53

Nieregularne kształty, grafika jako tło aplikacji a na grafikę nałożone kontrolki.
P-178566
pekfos
» 2021-05-09 11:37:21
Możesz próbować z WS_EX_COMPOSITED i WS_EX_TRANSPARENT.
https://docs.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles
P-178567
megusta
Temat założony przez niniejszego użytkownika
» 2021-05-09 18:47:25
Hmm, czy te flagi (WS_EX_COMPOSITED i WS_EX_TRANSPARENT) mogą odpowiadać za to, że obrazek bmp 32bit się wgl nie pojawia? aplikacja jest cała przezroczysta. W zasadzie bez tych flag też wszystko jest przezroczyste i nie renderuje się bmp 32 bit, ale za to normalnie działa i renderuje gdy używam tego samego obrazka tylko w bmp 28 bit.
P-178572
pekfos
» 2021-05-10 18:13:50
Zobacz czy w ogóle LoadImage() zwraca poprawną wartość dla tego obrazu.

Jest jeszcze taki trik, który może będzie wystarczający, jeśli potrzebujesz przezroczystości, ale nie stopni przezroczystości (alfy). Styl WS_EX_LAYERED i
C/C++
SetLayeredWindowAttributes( hwnd, RGB( 255, 0, 255 ), 0, LWA_COLORKEY );
Wystarczy zwykła bitmapa 24-bitowa (pattern brush w hbrBackground) i piksele które mają być przezroczyste ustawiasz na klasyczny róż 255,0,255.
P-178578
megusta
Temat założony przez niniejszego użytkownika
» 2021-05-10 21:52:32
Zrobiłem jak pisałeś @pekfos. Przekonwertowałem png tła do bmp 24 bit oraz testowo w paint.net przefarbowałem bloki dookoła na rgb(255,0,255).

Kod:
C/C++
HBITMAP hbmp =( HBITMAP ) LoadImage( hinstance, MAKEINTRESOURCE( IDB_BG ), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
HBRUSH hbr = CreatePatternBrush( hbmp );

[ ... ]
SetWindowLong( hwnd, GWL_STYLE, GetWindowLong( hwnd, GWL_EXSTYLE ) | WS_EX_LAYERED );
SetLayeredWindowAttributes( hwnd, RGB( 255, 0, 255 ), 0, LWA_COLORKEY );

Aktualnie to wygląda tak, że renderuje się tło lecz dookoła ma kolor rgb(255,0,255) czyli ten różowy :)
P-178581
pekfos
» 2021-05-10 22:04:19
C/C++
SetWindowLong( hwnd, GWL_STYLE, GetWindowLong( hwnd, GWL_EXSTYLE ) | WS_EX_LAYERED );
Pomieszałeś GWL_STYLE z GWL_EXSTYLE, powinno być EX w obu. A najlepiej twórz okno przez CreateWindowEx() i tam od razu podawaj rozszerzone style.
P-178582
« 1 »
  Strona 1 z 1