Windows Kontextmenu in Directx Vollbild Anwendung
-
Durch Rechtsklick soll ein Kontextmenu erscheinen, dies funktioniert im Windowsfenster problemlos. Wechsle ich ins Vollbild, ohne das die Anwendung läuft, directx Texturen, Surface und Vertex sind angelegt, erscheint das Kontextmenu auch problemlos. Beginne ich nun die Anwendung, das heisst es wird ca. 50 mal pro Sekunde ein neues Bild auf den screen geworfen, erscheint das Kontextmenu auf Rechtsklick nur noch bei jedem 2 oder 3. Klick. Manchmal flakert es kurz auf und ist dann unsichtbar. Die Anwendung wird jedoch immer durch den Rechtsklick pausiert. Ich versteh dieses Verhalten nicht ganz. Ist es möglich, dass kurz nachdem das Kontextmenu erscheint, ein weiteres Bild gezeichnet wird und somit das Kontextmenu wieder übermalt? Würde das bedeuten, dass wenn ich ein Bild in den Backbuffer schiebe und dieses anschließend auf den screen bringe, dies parallel in der GPU zur eigentlichen Programmausführung geschieht?
Vielleicht hat jemand eine Lösung für mein Problem. Hab versucht die Darstellung des Kontextmenu durch ein Sleep zu verzögern aber ohne Erfolg.
-
Ein Workaround wäre, dass du das Menü in deiner Anwedung selber zeichnest... Nur so als Möglichkeit
-
Es ist auch mehr oder weniger die einzige Möglichkeit. Du kannst keine Windows-Controls zusammen mit Direct3D verwenden. Normalerweise steuert das Windows-System welche Pixel übermalbar sind, z.B. wenn du mit GDI-Funktionen etwas machst. Sobald du aber mit Direct3D oder OpenGL was zeichnest, hat der Grafiktreiber freie Hand. Er kriegt nur noch seine Malfläche zugewiesen (Fenster oder Vollbild) dann steuert da drin er die Anzeige.
Wenn du Steuerelemente willst, musst du sie mit Direct3D selber zeichnen.
Die Pause kommt wahrscheinlich daher, wie du die Windows-Messages abarbeitest. Ohne Code kann man es aber nicht mit Sicherheit sagen.
-
danke für die Infos
beim googeln hab ich ne Möglichkeit gefunden, das Windows Kontext Menu ohne Probleme auf den directx fullscreen zu bringen.
D3DPRESENTFLAG_LOCKABLE_BACKBUFFER als Flag beim initialisieren des dx9 Objektes verwenden und dann Device->SetDialogBoxMode(true);
Damit funzt es bei jedem Rechtsklick aber der Preis ist deutlich zu hoch, die Performance bricht extrem ein.
Ok also selber zeichen, stöhn.
-
Zur Info:
Liegt ganz einfach daran, dass du mehrere Render-Surfaces hast und GDI nicht weiß welche gerade die aktive ist und einfach in die GDI-Surface zeichnet.
Bei DirectDraw gabs immer eine FlipToGDISurface()-Funktion, wenn man die GDI brauchte.
-
es klappt jetzt mit dem Kontextmenu in direct fullscreen ohne Performanceverlust. einfach mit:
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Flags = (fullscreen) ? D3DPRESENTFLAG_LOCKABLE_BACKBUFFER : 0
Device->SetDialogBoxMode(false);initialisieren und beim Kontextmenu Aufruf Device->SetDialogBoxMode(true); und nach TrackPopupMenuEx SetDialogBoxMode wieder false setzen.