Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.08.2009, 20:53

[gelöst][c++/winAPI] Vordergrundfenster <--> Vollbildm

Hallo!

Also, ich habe ein DirectX Fenster, welches als Vollbildanwendung initialisiert wird. Will ich nun ein 2. Fenster öffnen (zum Beispiel Spielmenü), so ist dies logischerweise im Hintergrund. Auch Versuche mit SetForegroundWindow und SetActivateWindow ändern dies nicht. Dies hatte ich auch vermutet, immerhin ist Vollbild (in meinen Augen) IMMER im Vordergrund, auch der Taskmanger minimiert ja vorher die Anwendung ...
Daher, gibt es eine gute Lösung dafür über die WinAPI, oder muss ich die Fenster in DirectX erstellen, wenn ja, wird dies ggf. erleichtert?

Ich würde Lösungen mit der WinApi bevorzugen!

Danke,
kickerxy123

2

18.08.2009, 21:25

Das Fenster erstellst du ja sowieso über die WinApi, da DirectX diesbezüglich nichts anbietet.
Wenn du ein zweites Fenster aufmachen willst, musst du den Stil bzw. die Größe des Vollbildfensters vorher ändern.
Bei einem Menü macht das imo wenig sinn.
Das kannst du ja ganz normal wie ein Spielszenario rendern.
fka tm

3

18.08.2009, 23:16

vielleicht stehe ich aufm schlauch ...

also ich erstelle in meiner render()-Funktion ein WC_DIALOG, sofern die ESC- Taste gedrückt wird und nicht schon ein solches Fenster existiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(GetAsyncKeyState(VK_ESCAPE)) 
 {
//Spielmenü öffnen, wenn noch nicht vorhanden!

GS = _BREAK;
  if (FindWindow(WC_DIALOG,"Spielmenü") == false)    //Wenn Fenster nicht schon existiert!! 

    {
      hwnd_gamemenu = CreateWindowEx(0, WC_DIALOG, "Spielmenü", WS_VISIBLE | WS_OVERLAPPEDWINDOW | WS_EX_TOPMOST, 0, 0, 300, 300, NULL, NULL, NULL, NULL); 
      SetWindowLong(hwnd_gamemenu, DWL_DLGPROC, (long)Spielmenu); 
      SetForegroundWindow(hwnd_gamemenu);
      SetActiveWindow(hwnd_gamemenu);
      ShowWindow(hwnd_gamemenu, SW_SHOW); 
      CreateWin2(&Btn_Sm_BackToGame, "BUTTON","Zurück zum Spiel", WS_BORDER| ES_CENTER, 20, 20, 150, 30, ID_Btn_Sm_BACKTOGAME );
      CreateWin2(&Btn_Sm_QuitGame, "BUTTON","Spiel beenden", WS_BORDER| ES_CENTER, 20, 60, 150, 30, ID_Btn_Sm_QUITGAME );
      CreateWin2(&Btn_Sm_Options, "BUTTON","Optionen", WS_BORDER| ES_CENTER, 20, 100, 150, 30, ID_Btn_Sm_OPTIONS );
      
      
      
     }
} 

Soweit, so gut. Es öffnet sich nun besagter "Dialog" mit den drei erstellten Buttons. Das Problem ist ja nun - da ich mich im Vollbildmodus einer dx- Anwendung befinde, dass ich das neu erstellte Fenster gar nicht sehen kann ( es ist im Hintergrund). Klar macht es kein Sinn jetzt den Vollbildmodus rauszunehmen, das Spiel zu minimieren o.ä.

Oder habe ich dich falsch verstanden?

Naja ich gehe ins Bett, morgen sehen wir weiter, Danke schonmal,

kickerxy

4

19.08.2009, 09:36

Ja, du hast mich wohl falsch verstanden.

Entweder verlässt du den Vollbildmodus, um den Dialog anzuzeigen,
oder du realisierst das Menü mit DX (der übliche Weg).
fka tm

5

19.08.2009, 17:35

Okay, wenn ich das Menü in DirectX realisiere, welchen Weg empfiehlst du mir dann? Atm scheint mir DirectDraw der beste (einzige?) Weg...

Wenns so ist, dann setz ich mich gleich ran ;)

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

6

19.08.2009, 17:44

Es gibt dutzende Fertige GUI Lösungen für DirectX. Google hilft da ;)

Ich persönlich verwende sehr gerne CEGUI: http://www.cegui.org.uk/wiki/index.php/Main_Page

(Link)


Du kannst es allerdings haben, dass diese großen Lösungen für dich overkill sind. Was für Controls (Buttons, Listboxes etc?) brauchst du denn?

7

20.08.2009, 15:16

hm also ich hatte mir eher etwas "eigeneres" vorgestellt...
DirectDraw habe ich jetzt verworfen, das macht auch kein Sinn.

Gibt es eine gute Lösung für Dx9, wie man 2d-Modelle anzeigt?
Ich meine, in jedem Spiel gibt es ja 2D- Anzeigen, wie Minimaps, Buttons etc.

Sowas würde mir jetzt erstmal reichen, also einen Weg, wie man ein 2D-Modell (nehmen wir mal einen Button, der immer oben links in der Ecke sein soll) dauerhaft anzeigt. Er soll also immer obenlinks sein und sich nicht wegbewegen.

Eine "Fertigpackung", wie du mir vorgestellt hast, wäre mir in der Tat zu overkilled, zumal ich auf das "eigene" stehe ;) aber trotzdem danke
kickerxy

edit

Also eigentlich müsste man doch ein normales Viereck erstellen und mit DrawPrimitiveUP zeichnen, vorher noch D3DTS_PROJECTION auf Identity stellen, und danach wieder zurückstellen, oder? Aber dann müsste man dies jedesmal per Transform mit der Kamera mitbewegen

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

8

21.08.2009, 13:01

Du musst ein Viereck erstellen, bei dem du im FVF statt D3DFVF_XYZ D3DFVF_XYZRHW verwendest, und hinter den Vertexkoordinaten musst du noch einen 4. float Wert (den rhw Wert) angeben. Dadurch gibst du an, dass die Vertices mit diesem fvf bereits transformiert sind. Die Koordinaten musst du dann in Pixeln angeben (0,0 ist die linke obere Bildschirmecke). Dann einfach ganz normal rendern und fertig.
Ich hoffe du hast's verstanden
cu
Signaturen werden überbewertet

9

21.08.2009, 15:11

Vielen Dank! Genau das brauchte ich =) und es klappt auch.

damit hat sich diese Thema erstmal für mich erledigt, danke sehr an alle.


lg
kickerxy

Werbeanzeige