Afficher une toolbar quand on est en plein écran via DirectX

Afficher une toolbar quand on est en plein écran via DirectX - C - Programmation

Marsh Posté le 03-07-2003 à 17:31:25    

  Voilà, je suis actuellement en train de développer un petit jeu et pour la partie graphique, j'utilise DirectX sous Win98.
J'affiche un tapis de jeu (un bmp) en plein écran; voici une partie de mon code qui initialise ma fenêtre plein écran :
 

Code :
  1. HWND               hwnd, hwndToolbar;
  2.     WNDCLASS            wc;
  3.     DDSURFACEDESC       ddsd, ddsdTapis;
  4.     DDSCAPS  ddscaps;
  5.     HDC                 hdc;
  6.     WORD  i;
  7.     /*
  8.      * crée et déclare la classe de fenêtre
  9.      */
  10.     wc.style = CS_HREDRAW | CS_VREDRAW;
  11.     wc.lpfnWndProc = WindowProc;
  12.     wc.cbClsExtra = 0;
  13.     wc.cbWndExtra = 0;
  14.     wc.hInstance = hInstance;
  15.     wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
  16.     wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  17.     wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
  18.     wc.lpszMenuName = NAME;
  19.     wc.lpszClassName = NAME;
  20.     RegisterClass( &wc );
  21.    
  22.     /*
  23.      * Crée une fenêtre
  24.      */
  25.     hwnd = CreateWindowEx(
  26.         WS_EX_TOPMOST,
  27.         NAME,
  28.         TITLE,
  29.         WS_POPUP,
  30.         0, 0,
  31.         GetSystemMetrics( SM_CXSCREEN ),
  32.         GetSystemMetrics( SM_CYSCREEN ),
  33.         NULL,
  34.         NULL,
  35.         hInstance,
  36.         NULL );
  37.     if ( !hwnd )
  38.     {
  39.         return FALSE;
  40.     }
  41.     ShowWindow( hwnd, nCmdShow );
  42.     UpdateWindow( hwnd );
  43.     /*
  44.      * Crée l'objet DirectDraw
  45.      */
  46.     if FAILED( DirectDrawCreate( NULL, &lpDD, NULL ) )
  47.     {
  48.         return Fail( hwnd, "Impossible de créer l'objet
  49.                      DirectDraw.\n" );
  50.     }
  51.     // Obtient mode exclusif
  52.     if FAILED( lpDD->SetCooperativeLevel( hwnd,
  53.                DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN ) )
  54.     {
  55.         return Fail( hwnd, "Impossible de définir le niveau 
  56.                      coopératif.\n" );
  57.     }


 
Je précise que j'utilise un backbuffer.
 
Je voudrais savoir comment je dois m'y prendre pour pouvoir afficher une toolbar (le même genre que celle de Photoshop). Merci :)
 
Sinon, je voudrais savoir comment je peux faire aussi pour afficher un menu de la même manière que celui de Bryce 4 (ou 5), c'est-à-dire que le menu n'apparaît pas en temps normal, mais que dès que l'utilisateur approche la souris du haut de l'écran, le menu apparaît, puis lorsque l'utilisateur a cliqué sur un item de menu, ce dernier disparaît...

Reply

Marsh Posté le 03-07-2003 à 17:31:25   

Reply

Marsh Posté le 03-07-2003 à 17:32:33    

J'ajoute que je suis sous VC++ 5...

Reply

Marsh Posté le 03-07-2003 à 18:50:48    

Du temps où j'avais touché à DirectDraw, y'avait un exemple du SDK qui montrait le mixage de DirectX avec le GDI.
T'as essayé de créer une toolbar directement dans ta fenêtre ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 04-07-2003 à 08:52:48    

HelloWorld a écrit :

Du temps où j'avais touché à DirectDraw, y'avait un exemple du SDK qui montrait le mixage de DirectX avec le GDI.
T'as essayé de créer une toolbar directement dans ta fenêtre ?


 
oui, mais la fenêtre ne se crée pas. Je pense que c'est à cause des flags que j'ai mis dans ma fonction CreateWindowEx.

Reply

Marsh Posté le 04-07-2003 à 09:31:56    

Citation :

wc.lpszMenuName = NAME;


T'es sûr de cette ligne ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 04-07-2003 à 10:09:52    

J'ai repris ça d'un exemple, mais je sais qu'on peut mettre l'ID d'une resource MENU et dans CreateWindowEx, au 10ème paramètre, je dois mettre aussi l'ID de ma resource MENU. J'ai testé, mais le menu ne s'affiche pas :(... Jusqu'à présent, vu que j'avais pas mis de menu à mon appli, j'avais laissé NAME comme valeur...

Reply

Marsh Posté le 04-07-2003 à 12:22:45    

Bon, j'ai réussi à afficher ma toolbar via CreateDialog, mais j'ai un nouveau pb : quand je clique sur un contrôle (un bouton par ex) de cette toolbar, ma "fenêtre" (c'en n'est pas vraiment une vu qu'elle est en plein écran) n'arrive pas à reprendre l'interceoption des messages qui lui sont destinés :(
 
En +, je n'arrive même pas à déplacer ma toolbar via la souris.

Reply

Marsh Posté le 04-07-2003 à 16:32:56    

Personne en peut m'aider, svp? Parce que je suis vraiment coincer :(

Reply

Marsh Posté le 05-07-2003 à 20:16:25    

up:)

Reply

Marsh Posté le 07-07-2003 à 10:00:06    

help, svp! :hello:

Reply

Marsh Posté le 07-07-2003 à 10:00:06   

Reply

Marsh Posté le 07-07-2003 à 11:32:00    

Essaie de faire un SetFocus() sur ta fenêtre principale une fois que t'as fini d'utiliser ta toolbar.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-07-2003 à 13:50:29    

Harkonnen a écrit :

Essaie de faire un SetFocus() sur ta fenêtre principale une fois que t'as fini d'utiliser ta toolbar.


 
ah, ça se fait pas automatiquement dès que le clique dans la fenêtre?
 
Je commence à me demander si je ne devrais pas faire ma toolbar via une image qui représenterait une fenêtre Windows et des boutons et que je programmerais tous les événements moi-même (reprogrammer en qq sorte la classe CWND). C'est brutal comme solution, mais vu que personne ne me propose rien d'autre, faut bien que je trouve un moyen d'avancer...

Reply

Marsh Posté le 08-07-2003 à 13:56:22    

De toute façon, mélanger GDI et DirectX ça pue et c'est batard. Autant effectivement faire ta toolbar à la main !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-07-2003 à 14:17:08    

Harkonnen a écrit :

De toute façon, mélanger GDI et DirectX ça pue et c'est batard. Autant effectivement faire ta toolbar à la main !


 
Petite question en passant : comment je fais pour afficher du texte à l'écran (en DirectX ou GDI) avec une police de caractères que je choisis (Times New Roman, Vernada, etc.)?
 
Sinon, pour la gestion du clavier et de la souris : je garde ma fonction qui intercepte les messages Windows avec un switch ou j'utilise DirectInput?
 
Je précise que je débute en DirectX... :)

Reply

Marsh Posté le 08-07-2003 à 14:50:46    

Citation :

De toute façon, mélanger GDI et DirectX ça pue et c'est batard. Autant effectivement faire ta toolbar à la main !


 
Ah bon ?
Moi j'ai toujours cru que ça se mixait sans problème (une fenêtre DirectX s'utilise comme une fenêtre classique). En tous cas les exemples du SDK m'ont pas choqué.
rufo > tu as regardé dans le SDK ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-07-2003 à 11:07:08    

HelloWorld a écrit :

Citation :

De toute façon, mélanger GDI et DirectX ça pue et c'est batard. Autant effectivement faire ta toolbar à la main !


 
Ah bon ?
Moi j'ai toujours cru que ça se mixait sans problème (une fenêtre DirectX s'utilise comme une fenêtre classique). En tous cas les exemples du SDK m'ont pas choqué.
rufo > tu as regardé dans le SDK ?


 
oui, j'ai même regardé dans les ex du bouquin MS Press qui traite de DirectX 5 mais j'ai rien trouvé qui mixe fenêtres enfants et une fenêtre principale plein écran qui fait du DirectX...:(
 
ps: je vous pas non plus le pb de mixer du GDI et du DirectX vu que dans mes ex du bouquin, ils le font. Par contre, peut-être que c'est plus propre de faire tout en DirectX. Mais j'ai aps encore trouvé comment afficher du texte avec DirectX.
 
ps2: pourquoi TextOut du GDI ne prend pas en compte le '\n' dans une chaîne de caractères???

Reply

Marsh Posté le 09-07-2003 à 11:36:48    

TextOut affiche du text, c'est tout. Il affiche un après un des caractères...
Si tu veux le formatter, utilises GDI+.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-07-2003 à 15:18:20    

HelloWorld a écrit :

TextOut affiche du text, c'est tout. Il affiche un après un des caractères...
Si tu veux le formatter, utilises GDI+.


 
Merci, je vais regarder ça. Je connaissais pas.

Reply

Marsh Posté le 09-07-2003 à 15:48:37    

HelloWorld a écrit :

Ah bon ?
Moi j'ai toujours cru que ça se mixait sans problème (une fenêtre DirectX s'utilise comme une fenêtre classique). En tous cas les exemples du SDK m'ont pas choqué.
rufo > tu as regardé dans le SDK ?


Ben moi j'ai tjs eu des merdes [:sinclaire]
Entre les messages qui n'étaient pas interceptés par la toolbar, la focalisation aléatoire, etc... c'est pas vraiment byzance :/


Message édité par Harkonnen le 09-07-2003 à 15:49:00

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-07-2003 à 15:50:43    

En même temps j'ai pas bcp testé ... ça s'est limité à une boite de dialogue avec des radio button dedans.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 10-07-2003 à 17:14:15    

Harkonnen a écrit :


Ben moi j'ai tjs eu des merdes [:sinclaire]
Entre les messages qui n'étaient pas interceptés par la toolbar, la focalisation aléatoire, etc... c'est pas vraiment byzance :/


 
Si j'ai bien compris, le fait que ma toolbar reste figée (entre autre), ça peut être dû à la présence de fcts du GDI?

Reply

Marsh Posté le 10-07-2003 à 17:16:22    

au fait, j'ai  pas trouvé GDI+. J'ai juste trouvé une fct qui me plaît : DrawText. Elle me permet d'afficher du texte de plusieurs manières (centré, justifié, etc.) dans une zone rectangulaire. :)

Reply

Marsh Posté le 10-07-2003 à 17:18:45    

J'ai regardé un ex du SDK où y'a un mixage de fenêtres enfants avec une fenêtre principale DirectX plein écran. J'ai repris ce qu'ils avait fait, mais ça marche pas plus dans mon appli (du reste, j'ai pas pu vérifier que eux, ça marchait, mais je pense que oui)... :( Je dois être un boulet...

Reply

Marsh Posté le 10-07-2003 à 18:27:13    

c'est marrant, dans l'ex du SDK, pour accéder à une fct de DirctDraw, ils font lpDD->lpVtbl->Fonction() alors que moi, je fais directement lpMaSurface->Fonction(). Est-ce-que ça pourrait venir de là?
 
Bon, ça y est, j'arrive à créer ma toolbar et à la déplacer à l'aide de la souris sans pour autant perdre définitivement le focus de ma fichie principale.
 
Mais quand je mets à jour le contenu graphique de ma fenêtre principale via DirectX, ma toolbar disparaît (elle est recouverte) : normal. Mais j'arrive plus à la faire réapparaître!!! J'ai essayé ShowWindow, UpdateWindow, SetWindowPos (mais là, y'a pleins d'infos à mettre et je me trompe peut-être), MoveWindow et rien n'y fait. :( Au fait, pour récuppérer dans une structure RECT la zone occupée par ma toolbar, c'est bien GetWindowRect, non?


Message édité par rufo le 10-07-2003 à 18:32:02
Reply

Marsh Posté le 11-07-2003 à 16:26:07    

up:)

Reply

Marsh Posté le 12-07-2003 à 09:47:22    

re-up...

Reply

Marsh Posté le 18-07-2003 à 09:17:17    

Help, svp ;)

Reply

Marsh Posté le 21-07-2003 à 13:09:18    

Bon, ben juste pour dire que j'ai toujours mon pb et que j'ai plus trop d'idées (et pleins de questions en suspend) pour le résoudre :(

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed