Clientarea eines Fensters transparent, aktualisiert nicht beim bewegen
-
Ich hab' ja nur das eine Fenster. Hab' jetzt
HWND Parent = ::GetParent(hWnd); RECT r; ::GetWindowRect(hWnd, &r); InvalidateRect(Parent, &r, false);
in WM_MOVE drin, funzt trotzdem nicht. Wenn ich WS_EX_TRANSPARENT bei WindowCreateEx angebe, dann funzt es, aber da ist so ziemlich alles am flackern und krückenlahm. Außerdem ist dann nicht nur die Clientarea transparent, zu 80-90% verschwindet dann auch die Titelleiste und der Rahmen des Fensters.
Ich dachte, wenn ich die Koordinaten des Fensters an InvalidateRect übergebe, dann hört zumindest das flackern auf, aber Pustekuchen.
-
bei InvalidateRect TRUE nehmen
-
Hab' ich auch probiert, läuft auch nicht. Sonst noch eine Idee?
-
case WM_SIZE: InvalidateRect(hWnd, NULL, TRUE); break;
das würde ich in die wndproc vom parent reinschreiben
-
window schrieb:
case WM_SIZE: InvalidateRect(hWnd, NULL, TRUE); break;
das würde ich in die wndproc vom parent reinschreiben
quatsch!! ich nehms zurück.
-
Aso, es handelt sich gar nich um nen child-window ?
Dann fusch doch ne Region zurecht und setze die mit SetWindowRgn()
oder WS_EX_LAYERED und mit SetLayeredWindowAttributes() die Transparenz einstellen.
-
Nein, jetzt in meinem Test handelt es sich um ein Standard-Hello-World Fenster, wo ich einfach den Clientbereich transparent haben möchte, was halt normal weiß ist. Hintergrund ist der, dass ich für ein Tabcontrol für jedes Tab ein Fenster erstelle, wo dann der Hintergrund transparent sein soll. Da hab' ich mir gedacht, dass ich erst einmal versuche einfach nur den Clientbereich von einem normalen Fenster transparent zu machen. Dann müsste man das ja auf die Child-Windows ebenso anwenden können. Jetzt geht es mir aber nicht mehr nur um die Child-Windows, sondern nun interessiert es mich auch, wie ich das bei einem Hauptfenster anstelle. Irgendwie muss es ja gehen, denn, wenn ich das Fenster minimiere und anschließend maximiere, dann wird es ja aktualisiert, dann muss es ja auch irgendwie beim bewegen und resizen gehen, denke ich. Nur leider finde ich da keine Möglichkeit.
-
Wenns nen Hauptfenster ist geht das mit WS_EX_LAYERED ziemlich einfach.
z.B. Einfach alles was transparent sein soll weiss zeichnen und dann mittels SetLayeredWindowAttributes() den ColorKey auf weiss setzen.Naja, irgendwie scheint mir Transparenz bei Windows nicht gescheit gelöst vor.
Die DC scheinen teilweise irgendwie den Inhalt des drunter-liegenden DCs zu übernehmen, wenn sich das drunter-liegende Fenster neugezeichnet hat. Wie das genau zusammenhängt hab ich bisher nirgendswo gefunden...Ideal wäre, wenn die DC wirklich genau an ein Fenster gebunden wären und ne Bitmap mit Alpha-Kanal drin wäre. Die WM_ERASEBKGND könnte man völlig weglassen.
Schön wäre außerdem wenn die komplette Windows-Oberfläche Double-Buffered wäre
Aber egal
-
Naja, bei SetLayeredWindowAttributes hab' ich das Problem, dass es erst ab Win2000 unterstützt wird, und ich das nicht unbedingt als Grenze haben möchte. Ich werd' dann wohl einfach noch ein wenig testen, schauen wir mal.
Vielen Dank auf jeden schonmal für die Antworten.
-
Dann wäre noch die SetWindowRgn()-Variante möglich.
Btw, evtl. interessant:
http://support.microsoft.com/gp/lifewin
-
Ja, Regions wären eine Möglichkeit, aber etwas aufwendig die Region genau auf die Childs anzupassen.
Mir geht es hier bei dem Hauptfenster jetzt nur in erster Linie darum, dass ich der Meinung, dass es irgendwie gehen muss, einen besonderen Einsatzzweck hab' ich da gar nicht, also nicht bei Hauptfenstern. Ich denke einfach nur, dass wenn ich schon die Möglichkeit habe einen Hollow-Brush zu verwenden, dass ich Windows ja dann auch irgendwie sagen können muss, dass bzw. wann der Hintergrund, der ja eigentlich nicht da sein dürfte neu gezeichnet werden muss, damit wieder der Transparenz-Effekt entsteht.
Naja, schauen wir mal.
Danke auf jeden.