Layered Window Problem
-
Hi @ All.
ich habe folgende Fragen zu den Layered Windows:
1. wie kann ich, wenn ich den WS_EX_LAYERED-Style gesetzt habe, einen Hintergrund wählen, den der dann transparent macht und alles andere anzeigt?
2. Mit WS_EX_TOPMOST mache ich das in den Vordergrund.Bei mir macht er das gesammte fenster durchsichtig, wenn ich WS_EX_LAYERED angebe.
woran kann das liegen???danke.
-
-
nee, nich schon wieder alles vergessen^^.
ich habs versucht, aber es klappt nicht!
Das bild wird geblittet, passent auf das Fenster, aber das Fenster ist trotz Aufruf von SetLayeredWindowAttributes() unsichtbar...
hier mein Sourcecode:
#pragma once class CSkullWindow { public: CSkullWindow(HINSTANCE hInst); ~CSkullWindow(void); // The default window procedure with access to all class variables LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); // The static window procedure will call the not-static one static LRESULT CALLBACK WndProcStatic(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); HINSTANCE hInstance; HWND hWnd; WNDCLASSEX wClass; }; // ------------------------------------------------------------------------- #pragma comment(lib, "Msimg32.lib") #define _WIN32_WINNT 0x0500 #include <windows.h> #include "SkullWindow.h" #include "script.h" CSkullWindow::CSkullWindow(HINSTANCE hInst) { hInstance = hInst; MSG msg; FillMemory (&wClass,sizeof(WNDCLASSEX),0); wClass.cbSize = sizeof(WNDCLASSEX); wClass.style = CS_HREDRAW | CS_VREDRAW; wClass.lpfnWndProc = WndProcStatic; wClass.cbClsExtra = 0; wClass.cbWndExtra = 0; wClass.hInstance = hInstance; wClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wClass.hCursor = LoadCursor(NULL, IDC_ARROW); wClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wClass.lpszMenuName = NULL; wClass.lpszClassName = "Skull Window"; wClass.hIconSm = wClass.hIcon; if (!RegisterClassEx(&wClass)) { CSkullWindow::~CSkullWindow(); } hWnd = CreateWindowEx( WS_EX_LAYERED | WS_EX_TOPMOST, "Skull Window", "Skull Window", WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, this); ShowWindow(hWnd,1); UpdateWindow(hWnd); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } } CSkullWindow::~CSkullWindow(void) { } LRESULT CALLBACK CSkullWindow::WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc,cachedc; RECT rect; HBITMAP hbitmap; switch (Message) { case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); GetClientRect(hwnd,&rect); cachedc = CreateCompatibleDC(hdc); hbitmap = (HBITMAP)LoadBitmap(hInstance,MAKEINTRESOURCE(BITMAP_0)); SelectObject(cachedc,hbitmap); TransparentBlt(hdc, rect.left,rect.top, rect.right-rect.left,rect.bottom-rect.top, cachedc, 0,0, 506,327, RGB(255,0,255)); SelectObject(cachedc,hbitmap); DeleteObject(hbitmap); DeleteDC(cachedc); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd,Message,wParam,lParam); } } LRESULT CALLBACK CSkullWindow::WndProcStatic(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { if (Message == WM_CREATE) { SetWindowLong(hwnd,GWL_USERDATA,(LONG)((LPCREATESTRUCT)lParam) -> lpCreateParams); // Make this window visible SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA); } CSkullWindow *pThis = (CSkullWindow *) GetWindowLong(hwnd,GWL_USERDATA); if (pThis == 0) { return DefWindowProc(hwnd,Message,wParam,lParam); } else { return pThis -> WndProc(hwnd,Message,wParam,lParam); } }
-
Guck mal nach, welchen Fenster-Style Du sonst immer für ein Hauptfenster benutzt hast.
Danach sorge dafür, dass die GetMessage-Schleife aus dem Konstruktor verschwindet (gehört in die WinMain !).

-
die Message-Loop gehört in die WinMain??? aber das fenster ist doch in der Klasse.
Wofür ist der Message-Loop überhaupt??? --> Man hat doch die WndProc.
außerdem greift er nur auf msg zu und was soll dass denn?Danke.
-
so, jetzt habe ich statt WS_POPUP WS_OVERLAPPEDWINDOW benutzt.
aber jetzt ist das Fenster zwar sichtbar, aber es hat wieder einen Rahmen und so.
sry, dass ich hier nerve, aber irgendwie muss ich das ja mal lernen.
thx.
-
Die MessageLoop sorgt ja gerade dafür das die WindowProc überhaupt aufgerufen wird

Schau dir mal die doku zu DispatchMessage() an!
-
ja danke.
jetzt habe ich es auch verstanden:
das ist dafür, dass das Programm nicht direkt beendet wird, sobald er mit dem Erstellen des Fensters fertig ist. es soll erst beendet werden, wenn die Quit-Message da ist.yo, aber das Layered Window, um das es hier geht, geht immer noch verkehrt. Trotz WS_EX_LAYERED. kann mir einer mal sagen warum dass so ist? in der WndProc wird bei WM_CREATE doch das LayeredindowAttributes-viech aufgerufen. dass soll ja auch so sein, aber verstehe ich nicht, was dort verkehrt ist.
Danke.
-
merker schrieb:
Guck mal nach, welchen Fenster-Style Du sonst immer für ein Hauptfenster benutzt hast.
Funktioniert WS_EX_LAYERED nicht zusammen mit WS_POPUP ?
-
geeky schrieb:
merker schrieb:
Guck mal nach, welchen Fenster-Style Du sonst immer für ein Hauptfenster benutzt hast.
Funktioniert WS_EX_LAYERED nicht zusammen mit WS_POPUP ?
was denn dann???
ich hab schon viel versucht, aber irgendwie will das nicht funzen...danke danke.
-
geeky schrieb:
Funktioniert WS_EX_LAYERED nicht zusammen mit WS_POPUP ?
Doch. Perfekt sogar. War wohl bischen kryptisch mein Beitrag. Sorry.
Script-Styler schrieb:
aber irgendwie will das nicht funzen...
Es "funzt" perfekt. Hast Du ja gesehen bei WS_OVERLAPPEDWINDOW. Offenbar stimmt was mit der Grösse nicht.
Wie gross ist ein WS_POPUP mit CW_USEDEFAULT ? Setze da mal Zahlen ein.

-
lol

-
Danke danke mann!
Aber mein Problem ist nun, dass ich ein Bitmap mit lilanem Hintergrund RGB(255,0,255) einblende.
Aber wie bekomme ich diese Farbe nun transparent???danke.
-
Dann solltest du SetLayeredWindowAttributes() nicht mit Alpha-Wert benutzen, sondern mit LWA_COLORKEY und crKey auf dein lila setzen.
Dann brauchst du auch kein TransparentBlt().
Dein Fenster wird dann an allen Stellen wo eigentlich lila ist vollkommen transparent.
-
SetLayeredWindowAttributes(hwnd, RGB(255,0,255), 0, LWA_COLORKEY);Aber wie bekomme ich es hin, dass unten in der Taskleiste kein!!! Programm mehr angezeigt wird???
gibt es da nicht so ein ex-style dafür??thx.
-
Ein ToolWindow (WS_EX_TOOLWINDOW) hat glaube ich keinen Taskbar-Button.
-
Stimmt. WS_EX_TOOLWINDOW erzeugt keinen Taskbar-Button.
Allerdings lässt sich zusammen mit den anderen ExStyles dann kein MSDN-Designer-Richtlinien-Wettbewerb mehr gewinnen.
