[C Win32] Utilisation de la fonction CreateDialog()

Utilisation de la fonction CreateDialog() [C Win32] - C - Programmation

Marsh Posté le 11-08-2003 à 07:21:43    

Salut,
Je ne parviens pas a utiliser cette fonction pour creer une boite de dialogue (mais en fait je me demande, est-ce au'il faut d'abord creer une window avec CreateWindow par exemple?)
Je veux juste faire une petite appli comme en VB par exemple (form), en fait j'appelle CreateDialog dans le WinMain avec comme parent ben... DesktopWindow  :(  
Enfin j'ai rien compris a l'exemple msdn qui est pas top on va dire, et j'ai pas trouve ailleurs. Donc un bout de code serait le bienvenu (une fonction WinMain qui utilise CreateDialog quoi)
merci
   ANT
 
edit: au passage on peut me dire brievement la difference modal / modeless ?


Message édité par antsite le 11-08-2003 à 07:23:37
Reply

Marsh Posté le 11-08-2003 à 07:21:43   

Reply

Marsh Posté le 11-08-2003 à 10:03:25    

Je crois que "modeless" = non modale, çàd que le parent de la boîte de dial garde la haute main sur la gestion de ses événements et messages -- l'appelant continue à "tourner" derrière.
> C'est + compliqué.
 
Au contraire, une boîte modale (fonction DialogBox et non CreateDialog) prend la main et ne rend le contrôle à l'appelant (=le focus au parent) qu'une fois refermée par l'user.

Reply

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

C'est quoi tes problèmes ? C'est quoi ton code ?


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

Marsh Posté le 11-08-2003 à 10:11:59    

ben le probleme c'est que ca marche pas lol, ca compile mais rien n'est affiche quand j'execute, mais le programme est lance car pour l'arreter je suis oblige d'aller dans le gestionnaire des taches.
 
 

Code :
  1. #include <windows.h>
  2. #include "resource.h"
  3. #define CLS_NAME "toto"
  4. BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  5. {
  6. switch(msg)
  7. {
  8. case WM_INITDIALOG:
  9.  return TRUE;
  10. }
  11. return FALSE;
  12. }
  13. INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  14. {
  15. HWND hWnd;
  16. MSG msg;
  17. hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(MYDIALOG), GetDesktopWindow(), DlgProc);
  18. while(GetMessage(&msg, NULL, 0, 0))
  19. {
  20.  if (!IsDialogMessage(hWnd, &msg))
  21.  {
  22.   TranslateMessage(&msg);
  23.   DispatchMessage(&msg);
  24.  }
  25. }
  26.  return msg.wParam;
  27. }


 
Fichier ressource:
 
#include "resource.h"
 
MYDIALOG DIALOG 10, 10, 300, 110
STYLE WS_VISIBLE|WS_POPUP|WS_BORDER
CAPTION "Keyboard Hook"
BEGIN
    CTEXT "Select One:", 1, 10, 10, 280, 12
    PUSHBUTTON "&Test", 2, 75, 30, 60, 12
END
 
Enfin voila ma methode est surement tres mauvaise, mais sans exemples c'est chaud de bien partir du premier coup!

Reply

Marsh Posté le 11-08-2003 à 10:36:38    

Et si tu fais un ShowWindow(...) derrière ton CreateDialog(...)?

Reply

Marsh Posté le 11-08-2003 à 10:38:24    

http://msdn.microsoft.com/library/ [...] Dialog.asp
 

Citation :

After CreateDialog returns, the application displays the dialog box (if it is not already displayed) by using the ShowWindow function.


 
Après avoir créé, ajoute :

Code :
  1. ShowWindow( hWnd, SW_SHOW );


 
Ta boucle des messages ne va pa non plus. Faut appeler  IsDialogMessage qui effectue un traitement supplémentaire spécifique aux dialogues.
Je ne m'en souviens plus, mais je crois qu'un appel à  DestroyWindow est nécessaire aussi.
L'exemple de la msdn (Creating a Modeless Dialog Box) explique tout ça ...
http://msdn.microsoft.com/library/ [...] gBoxes.asp


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

Marsh Posté le 11-08-2003 à 11:01:50    

Ah oui le coup du ShowWindow en lisant (un peu vite) je pensais que c'etait pas l'application qui s'en chargeait justement  :whistle:  
Donc maintenant je vois quelquechose  :)  
Je vais voir pour le destroywindow aussi. Sinon pour le hwnd parent, ca gene pas de mettre celui du desktop? c'est mieux de mettre NULL?

Reply

Marsh Posté le 11-08-2003 à 11:22:14    

Code :
  1. case WM_CLOSE:
  2. DestroyWindow(hWnd);
  3. break;


 
j'ai rajoute ca, la dialog disparait mais dans le gestionnaire des tache elle est toujours la  :??:

Reply

Marsh Posté le 11-08-2003 à 11:24:04    

ShowWindow(hWnd, SW_HIDE) avant le Destroy


Message édité par VisualC++ le 11-08-2003 à 11:24:18
Reply

Marsh Posté le 11-08-2003 à 11:28:29    

na toujours pareil  :(

Reply

Marsh Posté le 11-08-2003 à 11:28:29   

Reply

Marsh Posté le 11-08-2003 à 11:43:06    

Bah oui. Il faut un PostQuitMessage quelque part ... dans WM_DESTROY par exemple ...
Et s'il faut appeler DestroyWindow, c'est pour provoquer l'envoie de WM_DESTROY lors de WM_CLOSE.


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

Marsh Posté le 11-08-2003 à 13:04:46    

T'es sur que tu la voulais "non modale", ta boite de dial ?

Reply

Marsh Posté le 11-08-2003 à 13:29:41    

non lol, j'en sais rien pour faire une appli boite de dialogue en general c'est modal ?


Message édité par antsite le 11-08-2003 à 13:30:33
Reply

Marsh Posté le 11-08-2003 à 13:44:12    

oui

Reply

Marsh Posté le 11-08-2003 à 13:58:07    

ok donc j'ai adpate le code :
 

Code :
  1. BOOL CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  2. {
  3. switch(msg)
  4. {
  5. case WM_INITDIALOG:
  6.  return TRUE;
  7. case WM_CLOSE:
  8.  EndDialog(hWnd, 0);
  9.  break;
  10. case WM_DESTROY:
  11.  PostQuitMessage(0);
  12.  break;
  13. }
  14. return FALSE;
  15. }
  16. INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  17. {
  18. DialogBox(hInstance, MAKEINTRESOURCE(MYDIALOG), GetDesktopWindow(), DlgProc);
  19. return 0;
  20. }

 
 
ca va ? qu'est-ce que je dois retourner dans WinMain, 0 ? ou ne pas mettre de return comme dans un int main() ?

Reply

Marsh Posté le 11-08-2003 à 14:18:42    

return msg.wParam c'est très bien.
msg.wParam a pour valeur celle qui a été passée à PostQuitMessage ...


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

Marsh Posté le 11-08-2003 à 14:21:52    

non mais je ne comprends pas parce que je n'ai pas de structure MSG dans le winmain  :??:

Reply

Marsh Posté le 11-08-2003 à 15:05:53    

Autre question, dois-je rajouter un WNDCLASS et le register dans le WinMain, j'ai trouver un code qui le fait...
pour le return, tout simplement:
return DialogBox(...);

Reply

Marsh Posté le 11-08-2003 à 18:53:04    

Alors soit tu fais CreateDialog avec une boucle des messages derrière (un peu débile dans ton cas), soit tu fais un return DialogBox ...


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

Marsh Posté le 12-08-2003 à 03:33:22    

Ok j'ai fait une boite modale c'est mieux.
Sinon j'ai essaye de register un WNDCLASS mais ca semble ne servir a rien, par exemple hIcon ne change pas l'Icone de ma dialog, comment la changer (avec un CreateWindow il suffit de changer la valeur de la WNDCLASS > hIcon.)
Donc ca sert a rien de mettre un RegisterCLass avant mon return DialogBox, vu que le curseur, l'icone, le background, tout ca ne change pas  :??:  
 
voila mon WinMain :
 

Code :
  1. INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  2. {
  3. WNDCLASSEX wc;
  4. memset(&wc, 0, sizeof(wc));
  5. wc.lpfnWndProc = DefDlgProc;
  6. wc.cbWndExtra = DLGWINDOWEXTRA;
  7. wc.hInstance = hInstance;
  8. wc.hCursor = LoadImage(NULL, MAKEINTRESOURCE(OCR_CROSS), IMAGE_CURSOR, 0, 0, 0); //MARCHE PAS
  9. wc.hIcon = LoadImage(NULL, MAKEINTRESOURCE(OIC_BANG), IMAGE_ICON, 0, 0, 0); //MARCHE PAS
  10. /*wc.hIconSm = LoadImage();*/
  11. wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  12. wc.lpszClassName = "KeybHook";
  13. RegisterClassEx(&wc);
  14. return DialogBox(hInstance, MAKEINTRESOURCE(MYDIALOG), NULL, DlgProc);
  15. }


Message édité par antsite le 12-08-2003 à 03:38:37
Reply

Marsh Posté le 12-08-2003 à 11:12:28    

Essai de comprendre ce que tu fais ...
D'un côté ru créés une dialog, soit une fenêtre de classe dialog, et de l'autre tu enregistres ta propre classe. Les 2 n'ont rien à voir. Si tu enregistres ta propre classe, c'est pour créer une fenêtre de cette classe. Les modifs apportées à ta classe n'auront absolument (et heureusement) aucun impact sur les autres classes, dont fait partie la classe dialog.
Pour changer l'icone, envoie WM_SETICON.
http://msdn.microsoft.com/library/ [...] ETICON.asp


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

Marsh Posté le 12-08-2003 à 11:38:34    

ah oui  :(  
bordel je l'ai pas invente ce truc c'etait dans un cours, attends l'URL: http://perso.wanadoo.fr/peggs/lang_101.htm
c'est moi qui n'est pas su lire son truc ?

Reply

Marsh Posté le 12-08-2003 à 16:54:35    

J'ai survolé ce code ...
Et soit j'ai pas tout pigé, soit c'est n'importe quoi.
 
- c'est quoi DialogFunc, ça sort d'ou ?
- si la classe des dialog s'appelait "dialog", je pourrais trouver une certaine logique à ce code, mais ce n'est pas le cas (c'est #32770).
http://msdn.microsoft.com/library/ [...] window.asp
En lisant ces tuts :
http://msdn.microsoft.com/library/ [...] ations.asp
http://msdn.microsoft.com/library/ [...] gBoxes.asp
 
je ne trouve aucune référence à RegisterClass.


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

Marsh Posté le 12-08-2003 à 19:24:03    

HelloWorld a écrit :

J'ai survolé ce code ...
Et soit j'ai pas tout pigé, soit c'est n'importe quoi.
- c'est quoi DialogFunc, ça sort d'ou ?
...


 
C'est la fonction de callback du dialog, dc ça sort de nulle part, elle gère les evn du dialog et c'est le programmeur qui la définit. Ce qui est en effet le cas à http://perso.wanadoo.fr/peggs/lang_105.htm


---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
Reply

Marsh Posté le 13-08-2003 à 10:48:35    

Ben si ça sort de son code ;)
Je trouvais nul part sa définition, d'ou mon interrogation ...


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

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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