AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DirectX LayeredWindow

Ein Thema von EWeiss · begonnen am 2. Aug 2011 · letzter Beitrag vom 3. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

DirectX LayeredWindow

  Alt 2. Aug 2011, 15:53
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

Geändert von EWeiss ( 2. Aug 2011 um 16:06 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 16:58
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 17:36
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

Geändert von EWeiss ( 2. Aug 2011 um 17:39 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 17:50
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 )
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 18:08
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
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 18:37
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).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 2. Aug 2011 um 18:40 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 18:59
Danke!
Dann muss ich mir was anderes überlegen .. tüfteln

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 19:40
Das ist auch nichts anderes als ein überlagertes LayeredWindow
und da flackert nix .. Hmmm

gruss

Geändert von EWeiss (11. Jul 2019 um 16:40 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 20:05
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: DirectX LayeredWindow

  Alt 2. Aug 2011, 20:43
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

Geändert von EWeiss (11. Jul 2019 um 16:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.
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