Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   DirectX LayeredWindow (https://www.delphipraxis.net/162029-directx-layeredwindow.html)

EWeiss 2. Aug 2011 14:53

DirectX LayeredWindow
 
Schon mal jemand gemacht oder erfahrung damit?
In MediaPortal wird ja meine DLL verwendet um Visualisierungen wiederzugeben.
Jetzt habe ich diese verbessert und möchte es möglich machen das man auf einem Transparenten DirectX window von dem ich das HDC zurückgebe will
diverse eigene Button und Labels zeichnen kann quasi über die eigentliche Visualisierung.
Bevor ich damit anfange macht das überhaupt sinn ein DX Window als parent in ein Visualisierungsfenster zu verschieben
Flackert dann dieses Windwow und wie sieht es aus mit den Button, Labels usw.. werden diese Automatisch skalliert?

Hab da also nicht wirklich viel erfahrung mit.

Ist ein Direct3D Layered Window nur für 3D objecte oder kann es auch für Button ec.. verwendet werden?
Sollte ja ein DirectX Window sein oder?

PS:
Das wichtigste bleibt es OnTop oder setzt es sich in den Hintergrund.

gruss

Medium 2. Aug 2011 15:58

AW: DirectX LayeredWindow
 
Habe ich das richtig verstanden?
Du hast ein Fenster, mit dessen Handle du ein DirectX-Device erstellt hast, und es als Rendertarget verwendest. Dessen (Windows-)Handle möchtest du exportieren, damit fremde Applikationen darauf zeichnen können, und zwar via WinAPI/GDI/GDI+. Richtig?
Wenn ja, dann wird das so vermutlich mindstens flackern, da das D3D-Overlay unabhängig von dem was Windows so macht da immer wieder drübernudeln wird, und man mit einem Present() bzw. Swap() unmittelbar den Backbuffer darstellt, ohne dass man noch jemanden etwas machen lassen kann bevor wirklich dargestellt wird, und an den Backbuffer kommt die GDI nicht ran. Das wird sehr wahrscheinlich auch bei einem Layered-Window so passieren, da sich WinAPI und DirectX nicht miteinander absprechen. Es kann aber sein, dass sich das ab Vista/Win7 unter der Aero-GUI günstiger verhält, da dort der ganze Desktop in einem D3D Device dargestellt wird. Nur ist das dann wenig universell.

Ich würde eher das Surface deines Backbuffers in einem Callback herausgeben bevor du Present() feuerst. Dann muss die andere Applikation allerdings mit Mitteln von DirectX zeichnen, und ein VCL TButton wäre nicht drin. Also müsste dieses Programm dann sein GUI von Hand rendern, nix mit WinAPI/GDI. Die Skalierung würde in diesem Fall dann eben genau so ausfallen, wie sich bei dir im Viz Backbuffer-Größe zum Viewport verhält.

EWeiss 2. Aug 2011 16:36

AW: DirectX LayeredWindow
 
Ich habe ein Handle vom Fenster der Visualisierung bsp. Milkdrop2
Darauf möchte ich ein LayeredWindow setzen am besten in DirectX.
Die frage.. D2D, D3D ? oder einfach nur ein normales LayeredWindow von dem ich dann einfach nur das HDC zurückliefere.

Ich habe gedacht da Mediaportal nur über DirectX zeichnet also nicht direkt auf ein HWND bietet sich ein DirectX LayeredWindow an.
In meiner DLL mache ich damit gar nichts sondern sete es nur als Parent auf das Fenster der Visualisierung
damit die Anwendung damit nichts am Hut habt.

Bleibt es OnTop, Flackert es und wie sieht da mit den Messagen aus..
bsp.. wenn ich eine Taste drücke die eine aktion vom gemalten Button ausführen soll.

Das verstehe ich jetzt nicht ahb mit DX noch nichts gemacht.
Zitat:

Ich würde eher das Surface deines Backbuffers in einem Callback herausgeben bevor du Present() feuerst.
Zitat:

Die Skalierung würde in diesem Fall dann eben genau so ausfallen, wie sich bei dir im Viz Backbuffer-Größe zum Viewport verhält.
Das wäre dann schonmal Ideal da ich selber nichts malen will.

gruss

Medium 2. Aug 2011 16:50

AW: DirectX LayeredWindow
 
Ach so! Ich habe es anders herum verstanden, also als wäre deine DLL die Visualisierung. Okay, dann hast du wirklich keine andere Wahl als drüberzujauchen und ggf. mit Flackern zu leben. Egal ob auf das HDC des Fensters direkt gemalt, oder Layered (mit o.g. Chance bei Aero). Das ist letztlich das selbe Problem, dass hier schon ab und an mal angefragt wird: Hier im Forum suchenDirectX Overlay. Sollte es sich also tatsächlich bei der Visualisierung um ein DX-Target handeln, sieht es schlecht aus wenn du nur an das Fensterhandle ran kommst. Dann artet das nämlich in recht fiese DLL-Hookerei aus, und die Infos dazu sind extrem spärlich im Netz. (Mir ist nur noch im Hinterkopf, dass es eine Höllenarbeit sein soll. Vor allem ohne Kenntnisse der D3D API dürfte das ... sagen wir mal "interessant" werden ;) )

EWeiss 2. Aug 2011 17:08

AW: DirectX LayeredWindow
 
Ja ja mit deinem Link auf die Suche liegst du richtig ..
Da findet man nämlich so gut wie nix.

Interessant.. hmm wohl milde ausgedrückt!
Denke mal eher unmöglich :)

Mein gedanke war ein LayerdWindow zu verwenden um gerade das flackern zu unterdrücken.
Eigentlich dürfte DXWindow mit dem der Visualisisierung gar nichts am hut haben ich(Die Anwebdung) will ja nicht auf das Vis Window zeichnen.
Deshalb ja auch das Layered überlagert.

gruss

Medium 2. Aug 2011 17:37

AW: DirectX LayeredWindow
 
Naja, das ist halt genau auch des Pudels Kern: DirectX ist ein Overlay über dem, was die WinAPI so zeichnet, und folglich auch über einem Layered Window.* Aus der normalen WinAPI heraus kommt du da auch nicht zwischen/vor/zuvor, da beißt die Maus keinen Faden ab. Leider. Man muss zwangsweise an den Backbuffer des dem Fenster zugewiesenen D3D Devices ran, und idealerweise auch die Bufferflips mitbekommen (-> Hooken). Eine D3D-Anwendung, die nicht explizit eine Schnittstelle für solche Aktionen bietet, ist meines Wissens nach nicht anders beizukommen. (Hatte vor 2-3 Jahren eine sehr ähnliche Such-Odyssee.)

*) Technisch ist es sogar so, dass DX-Buffer erst "ganz hinten" in der Verarbeitung der Grafikkarte, knapp vor Ausgabe ans Bildschirmkabel sozusagen, die entsprechenden Bereiche des "normalen" Framebuffers übernageln. Aus Sicht von Windows sind solche Fenster i.A. einfach schwarz (mit Ausnahme von Aero).

EWeiss 2. Aug 2011 17:59

AW: DirectX LayeredWindow
 
Danke!
Dann muss ich mir was anderes überlegen .. tüfteln ;)

gruss

EWeiss 2. Aug 2011 18:40

AW: DirectX LayeredWindow
 
Das ist auch nichts anderes als ein überlagertes LayeredWindow
und da flackert nix .. Hmmm

gruss

Medium 2. Aug 2011 19:05

AW: DirectX LayeredWindow
 
Wo stammt das her? Was ist das im Hintergrund? Woher weisst du, dass es ein Layered Windows ist? Was für ein OS? Wie ist dessen GUI konfiguriert? Welche Grafikkarte? (Manch kleinere Modelle müssen für zu hohe Featuresets von DX auf Softrendering zurückgreifen, was ggf. einen Einfluss haben könnte)... Die Informationslage ist einfach sehr dünn bei dir ;)
Und letztendlich kannst du es doch einfach auch mal konkret ausprobieren! Dann dürften sich deine Fragen vom Anfang doch recht eindeutig lösen lassen - ein Layer für ein Fenster zu machen, und sei es erstmal mit einem Testbutton drauf, sollte recht fix gehen denke ich doch.

EWeiss 2. Aug 2011 19:43

AW: DirectX LayeredWindow
 
Zitat:

Zitat von Medium (Beitrag 1114802)
Wo stammt das her? Was ist das im Hintergrund? Woher weisst du, dass es ein Layered Windows ist? Was für ein OS? Wie ist dessen GUI konfiguriert? Welche Grafikkarte? (Manch kleinere Modelle müssen für zu hohe Featuresets von DX auf Softrendering zurückgreifen, was ggf. einen Einfluss haben könnte)... Die Informationslage ist einfach sehr dünn bei dir ;)
Und letztendlich kannst du es doch einfach auch mal konkret ausprobieren! Dann dürften sich deine Fragen vom Anfang doch recht eindeutig lösen lassen - ein Layer für ein Fenster zu machen, und sei es erstmal mit einem Testbutton drauf, sollte recht fix gehen denke ich doch.

Ich wollte das im Vorfeld klären warum soll ich mir die Arbeit mit DX machen wenn ich nachher feststellen muss das es nicht geht.
Das im Hintergrund ist Milkdrop2 das Fenster davor ist von meinem VMPiano das ist garantiert Layered (sonst könntest du Milk dahinter gar nicht sehen).
Ich habe es aber mal mit meiner DLL getestet (Normales Layered Window)

Theoretisch würde es ohne Flackern gehn das problem ist nur das man ein Layered Window nicht als Parent(Child) einfügen kann.
Das Layered Window wird dann sofort beendet ... und somit hat sich das hier auch erledigt da es für mich
anders nicht wirklich einen Sinn macht(das Fenster läßt sich nicht ONTOP halten).

bsp. Milkdrop2 im VollBildschirm (ist in DirectX geschrieben) :)

Hier noch ein Bild von TuneClipper
Aber wie schon gesagt das ist kein Parent sondern ein überlagertes Layered Window.
Und es flackert auch hier nichts.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz