Ich möchte Direct3D (9) für Hintergrundgrafik benutzen, und stinknormale Win32-Fenster (Knöpfe und sowas) drüberzeichnen lassen.
Ein Bisschen Recherche hat ergeben, dass das ein harter Brocken sein soll. Eigene Experimentiere hingegen haben es unter Windows 7 mit Classic Theme ziemlich schnell funktionieren lassen: das Hintergrundfenster braucht bloß WS_EX_COMPOSITED damit streng die Zeichenreihenfolge von hinten nach vorn eingehalten wird.
Aber ich möchte es auch unter Windows XP haben und habe kein System zum testen hier. Hat jemand Erfahrungen mit der Situation? Ist WS_EX_COMPOSITED ein Trugschluss?
[D3D9] mit WinAPI kombinieren
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [D3D9] mit WinAPI kombinieren
Ein paar Knöpfe und eine Toolbar:
Ich werde prüfen, was ich sonst noch an Controls reinkriege. Ich muss unbedingt ein XP-System zum Testen anschaffen. Es steht auch noch völlig in den Sternen, wie die Leistung ist.
-
- Establishment
- Beiträge: 426
- Registriert: 23.01.2013, 15:55
Re: [D3D9] mit WinAPI kombinieren
Wenn eine Exe angehängt wäre, könnte man es ja schnell ausprobieren.
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [D3D9] mit WinAPI kombinieren
Merci! Ich hoffe, dass die XP-CRT von Visual Studio 2012 hält, was sie verspricht. Habe sie statisch eingebunden. Als DirectX-SDK *sollte* June 2010 reichen.
Ich habe dummerweise D3D *nach* Erzeugen des Fensters initialisiert; du musst einmal die Größe ändern wenn du startest damit überhaupt was sichtbar wird.
Ich habe gerade gemerkt, dass die Toolbar mit Aero flimmert aber mit Classic nicht. Mal gucken, was das wieder ist.
Ich habe dummerweise D3D *nach* Erzeugen des Fensters initialisiert; du musst einmal die Größe ändern wenn du startest damit überhaupt was sichtbar wird.
Ich habe gerade gemerkt, dass die Toolbar mit Aero flimmert aber mit Classic nicht. Mal gucken, was das wieder ist.
- Dateianhänge
-
[Die Dateierweiterung exe wurde deaktiviert und kann nicht länger angezeigt werden.]
- Krishty
- Establishment
- Beiträge: 8350
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [D3D9] mit WinAPI kombinieren
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: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?
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:
Mhmm mhmm. Damit wäre die Eingangsfrage beantwortet: D3D + Win32 auf dem selben HWND ist nicht erlaubt.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.
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?).Under the DWM, this is much more problematic, because there can be no guarantee of ordering between the DirectX and the GDI rendering.
Ja — was ich hier mache ist böse.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.
Das klingt fast, als sei dieses Szenario Hardware-beschleunigt. Hmmmmmmm.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.
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?