Forum Clubic

[C/C++/C#] API Windows : création de boite de dialogueS

salut a tous

je suis entrain de découvrir l’API windows !
avec l’aide d’initiation g apris a creer une boite de dialogue :

http://bob.developpez.com/tutapiwin/article_1.php
(tres bonne initiation que je conseil a tout le monde d’ailleurs!)

j’ai créé ma boite de dialogue :

[cpp]
#include <Windows.h>
#include “resource1.h”

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hDlg;
hDlg=CreateDialog(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)MainProc);
ShowWindow(hDlg,SW_SHOW);

MSG msg;
while(GetMessage(&msg,NULL,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
int Select;
switch(message)
{
case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{
case IDOK:
EndDialog(Dlg,0);
PostQuitMessage(0);
return TRUE;
case IDCANCEL:
EndDialog(Dlg,Select);
PostQuitMessage(0);
return TRUE;
}
default:
return FALSE;
}
}
[/cpp]
il sagit d’une boite la plus basic qu’il soit un bouton OK et ANNULER

.
MON PROBLEME :
je souhaiterais ouvrir une nouvelle boite de dialogue (la même pour l’instant) lorsque l’on appui sur Ok.
je ne réussi pas.
l’interet serai de faire le menu d’un jeu sans utiliser des biblioteques d’affichage.

que penser vous de GTK+ et de MFC ?
bien que GTK soit portable sous linux, ne vaut il pas mieux apprendre a utilise l’API window pour plus de précision?
esce vraiment nécéssaire de comprendre son fonctionnement ?

voilà, merci d’avance et vive clubic

C’est le même principe que tu as utilisé pour créer ta boite de dialogue principale !

Tu dois d’abord créer une fonction callback pour ta Dialog secondaire sur le même principe que ta fonction MainProc, puis décider si tu souhaites afficher une Dialog modale ou non.

Si c’est une modale, utilise la fonction DialogBox()
Sinon, utilise CreateDialog()
Tout ceci dans le case IDOK: de ta fonction MainProc()

c un peu pres ce ke j’ai fait.
je n’ais pas d’erreur de compilation.

mais lorsque je clique , la deuxiemme boite de dialogue n’apparait pas :frowning:

sa va faire une petite semaine que je bloque dessus

j’affiche mon code en esperant qu’une ame charitable me file un coup de main :

[cpp]
#include <Windows.h>
#include “resource.h”

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK MainProc2(HWND Dlg2,UINT message2,WPARAM wParam2,LPARAM lParam2);

HINSTANCE hInstance2;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInstance2=hInstance;
HWND hDlg;
hDlg=CreateDialog(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)MainProc);
ShowWindow(hDlg,SW_SHOW);

   MSG msg; 
   while(GetMessage(&amp;msg,NULL,0,0)==TRUE) 
   { 
        TranslateMessage(&amp;msg); 
        DispatchMessage(&amp;msg); 
   } 
   return 0; 

}

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{
int Select;
switch(message)
{
case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{
case IDEntrer:
//EndDialog(Dlg,0);
//PostQuitMessage(0);
HWND hDlg2;
hDlg2=CreateDialog(hInstance2,(LPCTSTR)IDD_DIALOG2,hDlg2,(DLGPROC)MainProc2);
ShowWindow(hDlg2,SW_SHOW);

			 MSG msg2; 
			 while(GetMessage(&amp;msg2,NULL,0,0)==TRUE) 
			 { 
		 	    TranslateMessage(&amp;msg2); 
	 			DispatchMessage(&amp;msg2); 
	  		 } 
			 
			 
             return TRUE; 
          case IDSortir: 
             EndDialog(Dlg,Select); 
             PostQuitMessage(0); 
             return TRUE; 
        } 
     default: 
        return FALSE; 
   } 

}
LRESULT CALLBACK MainProc2(HWND Dlg2,UINT message2,WPARAM wParam2,LPARAM lParam2)
{
int Select;
switch(message2)
{
case WM_COMMAND:
Select=LOWORD(wParam2);
switch(Select)
{
case IDOK:
EndDialog(Dlg2,0);
PostQuitMessage(0);
return TRUE;
case IDCANCEL:
EndDialog(Dlg2,Select);
PostQuitMessage(0);
return TRUE;
}
default:
return FALSE;
}
}
[/cpp]

[cpp]
#include <Windows.h>
#include “resource.h”

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK MainProc2(HWND Dlg2,UINT message2,WPARAM wParam2,LPARAM lParam2);

HWND hDlg2;
HINSTANCE hInstance2;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInstance2=hInstance;
HWND hDlg;

    hDlg=CreateDialog(hInstance,(LPCTSTR)IDD_DIALOG1,GetDesktopWindow(),(DLGPROC)MainProc); 
    hDlg2=CreateDialog(hInstance2,(LPCTSTR)IDD_DIALOG2,GetDesktopWindow(),(DLGPROC)MainProc2);
    ShowWindow(hDlg,SW_SHOW);  
        
       MSG msg;  
       while(GetMessage(&amp;msg,NULL,0,0)==TRUE)  
       {  
              TranslateMessage(&amp;msg);  
              DispatchMessage(&amp;msg);  
       }  
       return 0;  

}

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)  
{  
       int Select;  
       switch(message)  
       {  
           case WM_COMMAND:  
              Select=LOWORD(wParam);  
              switch(Select)  
              {  
                  case IDEntrer:
                  {
	ShowWindow(hDlg2,SW_SHOW);
	return TRUE;
                 }
                  case IDSortir:  
                     EndDialog(Dlg,Select);  
                     PostQuitMessage(0);  
                     return TRUE;  
              }  
           default:  
              return FALSE;  
       }  
}  

LRESULT CALLBACK MainProc2(HWND Dlg2,UINT message2,WPARAM wParam2,LPARAM lParam2)
{
int Select;
switch(message2)
{
case WM_COMMAND:
Select=LOWORD(wParam2);
switch(Select)
{
case IDOK:
EndDialog(Dlg2,0);
return TRUE;
case IDCANCEL:
EndDialog(Dlg2,Select);
return TRUE;
}
default:
return FALSE;
}
}
[/cpp]

Merci bcp !
encore une fois vive clubic !
ya pas à dire.
Vous etes vraiment hyper sympas les gas, j’espere pouvoir vous rendre la pareil un jour !

Bonjour,

Es que vous savez comment modifier la couleur
d’une boite de dialogue crée à l’aide de CreateDialog() ?
Merci de votre aide !

Ne faudrait-il pas peindre un rectangle de ta couleur à chaque message WM_PAINT envoyé?

Sinon tu peux créer ta fenêtre directement dans le code, sans resource, et la je crois que tu pourras modifier la couleur de fond (grâve à l’attribut hbrBackground dans WNDCLASSEX ou WNDCLASS).

Voilà un petit code te montrant comment peindre la fenêtre de la couleur que tu veux. Ce code est à mettre dans la procédure de message. Il y a peut-être des fautes (qui a dit sans doute :paf: ?) mais j’espère que ca pourra t’aider.

Je trouve que GDI est une des parties les plus compliquées de Windows (côté User-mode). Le mieux c’est de lire toute la doc de MSDN à ce sujet. Elle est énorme mais au moins à la fin on ne perd plus de temps sur des petites fautes.

Voici mon code:


  case WM_PAINT:
  {

      //Lors d'un envoie du message de WM_PAINT (demandant de redessiner la fenêtre (ou une partie de la fenêtre)
      // la procédure peut appeler "BeginPaint" (et finir par EndPaint) afin d'obtenir un DC (Device Context)
      // ce DC permettra de dessiner dans la partie qui doit être redessinée (peut-être toute la fenêtre, peut être une partie)
      PAINTSTRUCT ps = {0};	
      HDC hDC = BeginPaint(Dlg, &ps);

            //Je crée une brush afin de choisir de quel couleur sera le contenu de ma fenêtre (puisque je dessinerai toujours la
            // fenêtre avec la même couleur
            // le premier et seul argument est est "COLORREF", grâce au macro RGB je peux choisir le taux de couleur de chacune
            //  	des valeurs (Rouge - Vert - Bleu, une valeur de 0 à 255 valeurs, de aucune couleur de ce type jusqu'au max). Ici j'ai choisi rouge pétant (R:255, V:0, B:0)
            HBRUSH hBrush = CreateSolidBrush( RGB(255,0,0) );

            //Maintenant que j'ai choisi ma couleur de peinture je peux remplir le carré
            // le premier argument est le DC (la ou je vais dessiner, celui qu'il faut redessiner, la fonction BeginPaint m'a en faite demandé
            // de repeindre une zone (cette zone est seulement là "nouvelle" zone, celle qui était cachée avant)
            FillRect(hDC, &ps.rcPaint, hBrush);


            //Après avoir créé la brush je la supprime simplement (histoire de ne pas avoir plein de brush qui trainent dans la mémoire!)
            DeleteObject( hBrush );

      //Voilà, j'ai fini de peindre. Je signal à Windows que c'est fini. Il peut poser le DC dans le fenêtre
      EndPaint(Dlg, &ps);


      //Note: J'aurai pu créer la brush en début de programme puis la supprimer à la fin, ceci prendrait beaucoup moins de
      //resource processeur puisque la brush est créée une fois (tandis que ici elle sera peut-être créée puis supprimée des dizaines de fois)

  }

Ok merci !
Moi j’utilise directement une boite de dailogue sans créer une fenêtre, et
je pense que cela rend les choses plus compliqué, je devrai peut être
refaire toutes l’appli basée sur une fenêtre et sans avoir un resource !
Encore merci de ton aide !

Super j’ai réussi à le faire grâce à ton programme !
Merci…

bonjour,voila g un probleme avec punkbuster quand je veux jouer a fear ca me marque que g un probleme avec unknown api function windows [131131] g chercher parti sur google et g rien trouver .