Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2977 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C Win32] Utilisation de la fonction CreateDialog()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C Win32] Utilisation de la fonction CreateDialog()

n°483002
antsite
Je me souviens
Posté le 11-08-2003 à 07:21:43  profilanswer
 

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
mood
Publicité
Posté le 11-08-2003 à 07:21:43  profilanswer
 

n°483081
ACut
Posté le 11-08-2003 à 10:03:25  profilanswer
 

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.

n°483083
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 10:07:10  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°483087
antsite
Je me souviens
Posté le 11-08-2003 à 10:11:59  profilanswer
 

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!

n°483110
ACut
Posté le 11-08-2003 à 10:36:38  profilanswer
 

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

n°483116
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 10:38:24  profilanswer
 

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
n°483167
antsite
Je me souviens
Posté le 11-08-2003 à 11:01:50  profilanswer
 

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?

n°483190
antsite
Je me souviens
Posté le 11-08-2003 à 11:22:14  profilanswer
 

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  :??:

n°483193
VisualC++
J'va y penser ...
Posté le 11-08-2003 à 11:24:04  profilanswer
 

ShowWindow(hWnd, SW_HIDE) avant le Destroy


Message édité par VisualC++ le 11-08-2003 à 11:24:18
n°483198
antsite
Je me souviens
Posté le 11-08-2003 à 11:28:29  profilanswer
 

na toujours pareil  :(

mood
Publicité
Posté le 11-08-2003 à 11:28:29  profilanswer
 

n°483212
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 11:43:06  profilanswer
 

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
n°483326
ACut
Posté le 11-08-2003 à 13:04:46  profilanswer
 

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

n°483343
antsite
Je me souviens
Posté le 11-08-2003 à 13:29:41  profilanswer
 

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
n°483355
VisualC++
J'va y penser ...
Posté le 11-08-2003 à 13:44:12  profilanswer
 

oui

n°483387
antsite
Je me souviens
Posté le 11-08-2003 à 13:58:07  profilanswer
 

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() ?

n°483417
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 14:18:42  profilanswer
 

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
n°483429
antsite
Je me souviens
Posté le 11-08-2003 à 14:21:52  profilanswer
 

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

n°483546
antsite
Je me souviens
Posté le 11-08-2003 à 15:05:53  profilanswer
 

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(...);

n°483918
HelloWorld
Salut tout le monde!
Posté le 11-08-2003 à 18:53:04  profilanswer
 

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
n°484352
antsite
Je me souviens
Posté le 12-08-2003 à 03:33:22  profilanswer
 

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
n°484666
HelloWorld
Salut tout le monde!
Posté le 12-08-2003 à 11:12:28  profilanswer
 

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
n°484692
antsite
Je me souviens
Posté le 12-08-2003 à 11:38:34  profilanswer
 

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 ?

n°485160
HelloWorld
Salut tout le monde!
Posté le 12-08-2003 à 16:54:35  profilanswer
 

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
n°485345
ACut
Posté le 12-08-2003 à 19:24:03  profilanswer
 

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/
n°485805
HelloWorld
Salut tout le monde!
Posté le 13-08-2003 à 10:48:35  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C Win32] Utilisation de la fonction CreateDialog()

 

Sujets relatifs
Win32 console application plus rapide qu'une application Windowsfonction Random pas si aleatoire ke sa
[Résolu] formulaire => données envoyés à fonction php ?[Windows] Fonction socket : sendto(...)
[Résolu] formulaire => données envoyés à fonction php ?HELP, pb avec fonction if
Créer un lien dans XSL en fonction de données dans XML[ACCESS]Questions sur la multi utilisation
probleme de fonctionUtilisation de Runtime.exec
Plus de sujets relatifs à : [C Win32] Utilisation de la fonction CreateDialog()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR