Okay; also Controls gehen ganz gut, nur: Transparenz ist für’n Popo.
Mit Aero wurde transparentes GDI-Zeichnen abgeschafft.
SetBkMode(hdc, TRANSPARENT) und
NULL_BRUSH/
HOLLOW_BRUSH haben keine Wirkung sobald Aero aktiviert ist. Das macht wirklich wirklich hässliche Blöcke.
Offenbar bin ich nicht allein mit diesem Problem:
Hier (keine Antworten);
hier (als Aero-Bug abgetan);
hier (keine Lösung);
hier (Frage nicht verstanden);
hier (Frage nicht verstanden);
hier (keine Antwort);
hier (kaum behilflich).
Und das ist wirklich ironisch: Aero, das Flackern abschaffen und sichere Komposition ermöglichen sollte, lässt dafür alle alten Programme, die das früher sauber geschafft haben, flimmern wie eine Motel-Neonröhre und und lässt transparente Flächen dichter decken als Deine Mutter®. Ich kann Direct3D und GDI problemlos überlagern – aber nur
ohne Aero. Ganze Arbeit!
Greg Schlechter erklärt ein Bisschen:
Greg Schechter's Blog — Redirecting GDI, DirectX, and WPF applications hat geschrieben:The form of mixing that doesn't work well is when an application uses DirectX and GDI to target the same HWND. This has never been a supported scenario with DirectX, but there have been scenarios where it has happened to work.
Mhmm mhmm. Damit wäre die Eingangsfrage beantwortet: D3D + Win32 auf dem selben HWND ist nicht erlaubt.
Under the DWM, this is much more problematic, because there can be no guarantee of ordering between the DirectX and the GDI rendering.
Meinen Beobachtungen nach besteht durchaus Ordnung; aber nur, so lange kein
WS_EX_TRANSPARENT im Spiel ist. Dann geht es nämlich leider ziemlich drunter und drüber (wörtlich?).
This is most troublesome when GDI and DirectX are not only rendering to the same HWND, but to overlapping areas of the same HWND. As such, this usage pattern is not supported.
Ja — was ich hier mache ist böse.
Note that there is an alternative that can often work for an application -- DirectX is capable of handing back a DC to a DirectX surface, and applications can perform GDI rendering to that DC. From the DWM's perspective, that DirectX surface remains purely rendered by DirectX, and all is well.
Das klingt fast, als sei dieses Szenario Hardware-beschleunigt. Hmmmmmmm.
Nur wie kriege ich die Child Windows dazu, in ein bestimmtes DC zu zeichnen? Aber wenn ich via
WM_PRINTCLIENT das Fenster in den D3D-DC zeichne, dann geht das nur, während die Controls in dem Fenster sichtbar sind. Wenn sie sichtbar sind, zeichnen sie aber bereits selber auf den Bildschirm (zusätzlich zum DC) und ich zeige letzten Endes alles doppelt an.
Wtf?! Wie kriege ich
WM_PAINT komplett abgebrochen (auch für alle Kinder!) und löse
WM_PRINTCLIENT für die Kinder aus damit die in dem DC landen, das D3D endlich auf dem Bildschirm ausgibt?