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

  FORUM HardWare.fr
  Programmation
  C

  résolu [API win32] probleme avec un petit exercice

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

résolu [API win32] probleme avec un petit exercice

n°1425448
big_dadi_f​at
Posté le 15-08-2006 à 01:06:53  profilanswer
 

Salut  :hello:  
Je débute en api win 32, et j'ai un petit prob avec un exercice.  
Je veut faire en sorte que si on édite le texte et on ferme le fenetre principal , alors un msgBox s'affiche en disant qu'on a éditer le fenetre .  
 
amis le prob c'est que le msgBox s'affiche meme si je né pas éditer le texte  .  
 
voici le code que j'ai fais  
 

Code :
  1. #include<windows.h>
  2. #define L 600       // largeur de la fenetre principale
  3. #define H 400       // hauteur de la fenetre principale
  4. #define IDM_QUIT 1  // identificateur du SouMenu Quitter
  5. // prototype de la procédure
  6. LRESULT CALLBACK Proc(HWND, UINT, WPARAM, LPARAM);
  7. HINSTANCE hinst;    // hinstance du contrôl d'édition
  8. // LA FONCTION PRINCIPALE (MAIN) :
  9. int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  10. {
  11.     HWND hwnd;              // hendle de la fenetre principale
  12.     MSG msg;                // variable des messages pour la boucle
  13.     WNDCLASS wc;            // structure (class) de la fenetre principale
  14.     HMENU hMenu, hSousMenu; // hendle de menu et sousmenu
  15.     // remplissage de la fenetre ******************************
  16.     wc.style = 0;
  17.     wc.lpfnWndProc = Proc;
  18.     wc.cbClsExtra = 0;
  19.     wc.cbWndExtra = 0;
  20.     wc.hInstance = hinstance;
  21.     wc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION);
  22.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  23.     wc.hbrBackground = CreateSolidBrush(RGB(234,235,71));
  24.     wc.lpszMenuName =  NULL;
  25.     wc.lpszClassName = "Class";
  26.     // enregistrement de la class ******************************
  27.     if ( !RegisterClass(&wc))    return FALSE;
  28.     // SousMenu Quitter
  29.     hSousMenu = CreateMenu();
  30.     AppendMenu(hSousMenu, MF_STRING, IDM_QUIT, "Quitter" );
  31.     // Menu Fichier
  32.     hMenu = CreateMenu();
  33.     AppendMenu(hMenu, MF_POPUP, (UINT) hSousMenu, "Fichier" );
  34.     // création de la fenetre principale ******************************
  35.     hwnd = CreateWindow("Class", "By Happy Hacker", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, L, H, NULL, hMenu, hinstance, NULL);
  36.     // montrer les fenetres ******************************
  37.     ShowWindow(hwnd, SW_SHOW);  // montrer la fenetre principale
  38.     // metre la fenetre principal à jours ******************************
  39.     UpdateWindow(hwnd);
  40.     // la boucle qui tréte les messages ******************************
  41.     while (GetMessage(&msg, NULL, 0, 0))
  42.     {
  43.         TranslateMessage(&msg);
  44.         DispatchMessage(&msg);
  45.     }
  46.     return msg.wParam;
  47. }
  48. // LES FONCTIONS :
  49. LRESULT CALLBACK Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  50. {
  51.     HWND hEdit;   // hendle du contôl d'édition
  52.     switch (uMsg)
  53.     {
  54.         int EditNotChg;
  55.         case WM_CREATE:
  56.             // création du contrôl d'édition
  57.             hwnd = CreateWindow("edit", "Salut tout le monde, je suis : bad_day.", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL, L/2-L/4, H/2-H/4, L/2, H/2, hwnd, NULL, hinst, NULL);
  58.             /* la police d'édit: */
  59.             HFONT hFont;
  60.             hFont = (HFONT) GetStockObject(ANSI_FIXED_FONT);
  61.             SendMessage(hEdit, WM_SETFONT, (UINT)hFont, TRUE );
  62.             /* les marges: */
  63.             SendMessage(hEdit, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(5,5));
  64.         return 0;
  65.         // afficher un msgBox quand on quitte en cas d'édition du texte , pour demander la confirmation
  66.         case WM_CLOSE:
  67.             if( EditNotChg || MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
  68.                 DestroyWindow(hwnd);
  69.         return 0;
  70.         case WM_COMMAND:
  71.             // poster la le message quitter au Smenu IDM_QUIT est bien son id
  72.             if( LOWORD(wParam) == IDM_QUIT )    PostMessage(hwnd, WM_CLOSE, 0, 0);
  73.             // verifier si le texte à été éditer ou pas
  74.             if(HIWORD(wParam) == EN_CHANGE )     EditNotChg = FALSE;
  75.          return 0;
  76.         case WM_DESTROY:
  77.             PostQuitMessage(0);
  78.         return 0;
  79.         default:
  80.             return DefWindowProc(hwnd, uMsg, wParam, lParam);
  81.     }
  82. }


 
 
Merci pour votre aide  :)


Message édité par big_dadi_fat le 15-08-2006 à 19:55:04
mood
Publicité
Posté le 15-08-2006 à 01:06:53  profilanswer
 

n°1425486
Amonchakai
Posté le 15-08-2006 à 09:46:15  profilanswer
 

Salut !
   Ben a mon avis essaye déja de mettre static ta variable EditNotChg

n°1425488
Amonchakai
Posté le 15-08-2006 à 09:51:23  profilanswer
 

et peut être a tord, mais j'aurrais mis aussi static hEdit...

n°1425497
Amonchakai
Posté le 15-08-2006 à 10:02:04  profilanswer
 

Non en fait c'est bon je viens de voir :  
 
dans ton code quand tu fait :

Code :
  1. case WM_CLOSE:
  2.    if( EditNotChg || MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
  3.       DestroyWindow(hwnd);
  4. return 0;


c'est normal qu'il t'envoie toujours la MessageBox() : au moment où il reçoit le message WM_CLOSE il fait tout simplement les vérification des deux booléen...
 
faudrait que tu fasse ça :
 

Code :
  1. if(!EditNotChg)
  2.     MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )


pour qu'il t'envoie la MessageBox() que quand le texte est modifié...

n°1425598
big_dadi_f​at
Posté le 15-08-2006 à 14:21:37  profilanswer
 

Oui , c'est vrés que comme ca , ca dois marché (je n'ai pas encor essayer :) ) , d'ailleur j'aller le faire au début.
 
mais je croyai que le teste que j'ai fais et aussi juste , voyons voir :
quand le msg a traiter est WM_CLOSE, on va tester :
 
si ( le texte n'ai pas modifier ou la répence au msg box est oui ) alors quitter....etc.
 
ici j'ai utiliser le ou qui est commr ca "||" , et pas comme ca "|" , et c'est la qu'il y a une differance:
quand en fais par exemple:  
P | Q  ==>  là les deux condition P et Q sont évaluer .
mais quand on fais:
P || Q  ==>  là Q n'ai évaluer que si P est FALSE.
 
/*oui c'est un peut de l'algebre de bool*/
 
donc dons mon éxemple, quand on texte si le texte n'ai pas modifier  et on trouve que c'est vrais (le texte né pas modifier) , on ne va pas texter la 2eme condition (celle du msgBox) .
 
donc c'est là que ca cloche pour moi  :pt1cable:  
 
 
 
 
 
encor merci

n°1425613
big_dadi_f​at
Posté le 15-08-2006 à 15:21:51  profilanswer
 

non non
méme avec ca :
 

Code :
  1. case WM_CLOSE:
  2.             if(!EditNotChg)
  3.                 if(MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
  4.                     DestroyWindow(hwnd);
  5.         return 0;


 
ca ne marche pas !
il m'afiche toujours le msgBox quoi qu'il en soit.  :(  
 
 

n°1425615
Amonchakai
Posté le 15-08-2006 à 15:27:21  profilanswer
 

pour moi déja je trouve que ça serait plus simple si tu déclarait EditNotChg booléen.
 
ensuite tu le met également static et tu l'initialise a true au début puis a false quand tu détecte le message  EN_CHANGE.  
 
Essaye déjà comme ça pour voir...


Message édité par Amonchakai le 15-08-2006 à 15:45:00
n°1425616
big_dadi_f​at
Posté le 15-08-2006 à 15:34:50  profilanswer
 

voici la nouvel procédure  

Code :
  1. LRESULT CALLBACK Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2. {
  3.     static HWND hEdit;   // hendle du contôl d'édition
  4.     static BOOL EditNotChg = TRUE;
  5.     switch (uMsg)
  6.     {
  7.         case WM_CREATE:
  8.             // création du contrôl d'édition
  9.             hwnd = CreateWindow("edit", "Salut tout le monde, je suis : Bad Day", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL, L/2-L/4, H/2-H/4, L/2, H/2, hwnd, NULL, hinst, NULL);
  10.             /* la police d'édit: */
  11.             HFONT hFont;
  12.             hFont = (HFONT) GetStockObject(ANSI_FIXED_FONT);
  13.             SendMessage(hEdit, WM_SETFONT, (UINT)hFont, TRUE );
  14.             /* les marges: */
  15.             SendMessage(hEdit, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(5,5));
  16.         return 0;
  17.         // afficher un msgBox quand on quitte en cas d'édition du texte , pour demander la confirmation
  18.         case WM_CLOSE:
  19.             if(!EditNotChg)
  20.                 if(MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
  21.                     DestroyWindow(hwnd);
  22.         return 0;
  23.         case WM_COMMAND:
  24.             // poster la le message quitter au Smenu IDM_QUIT est bien son id
  25.             if( LOWORD(wParam) == IDM_QUIT )    PostMessage(hwnd, WM_CLOSE, 0, 0);
  26.             // verifier si le texte à été éditer ou pas
  27.             if(HIWORD(wParam) == EN_CHANGE )  EditNotChg = FALSE;
  28.          return 0;
  29.         case WM_DESTROY:
  30.             PostQuitMessage(0);
  31.         return 0;
  32.         default:
  33.             return DefWindowProc(hwnd, uMsg, wParam, lParam);
  34.     }
  35. }


 
 
mais mentenant la fenetre ne ce ferme méme pas  :heink:  , quand j'ai initialiser EditNotChg à TRUE  :sweat:  
 
 
 

n°1425617
Amonchakai
Posté le 15-08-2006 à 15:38:15  profilanswer
 

laisse moi devinner : quand tu modifie le texte et que tu ferme tu as la MessageBox() pour quitter (qui marche correctement) mais par contre si tu n'a pas changé le texte et que tu essaye de fermer ça ferme plus...  
 
c'est ça ???

n°1425622
big_dadi_f​at
Posté le 15-08-2006 à 15:51:28  profilanswer
 

Amonchakai a écrit :

laisse moi devinner : quand tu modifie le texte et que tu ferme tu as la MessageBox() pour quitter (qui marche correctement) mais par contre si tu n'a pas changé le texte et que tu essaye de fermer ça ferme plus...  
 
c'est ça ???


 
 
Oui
 
 
 

mood
Publicité
Posté le 15-08-2006 à 15:51:28  profilanswer
 

n°1425623
Amonchakai
Posté le 15-08-2006 à 15:53:47  profilanswer
 

regarde de plus près ce qui se passe quand tu veut quitter et que EditNotChg est a true  :D
 
[edit] un indice : pas de DestroyWindow()....


Message édité par Amonchakai le 15-08-2006 à 15:56:07
n°1425628
big_dadi_f​at
Posté le 15-08-2006 à 16:03:23  profilanswer
 

c'est bon j'ai réglais le probléme  
 

Code :
  1. LRESULT CALLBACK Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  2. {
  3.     static HWND hEdit;   // hendle du contôl d'édition
  4.     static BOOL EditChg = FALSE;
  5.     switch (uMsg)
  6.     {
  7.         case WM_CREATE:
  8.             // création du contrôl d'édition
  9.             hwnd = CreateWindow("edit", "Salut tout le monde, je suis : Bad Day", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL, L/2-L/4, H/2-H/4, L/2, H/2, hwnd, NULL, hinst, NULL);
  10.             /* la police d'édit: */
  11.             HFONT hFont;
  12.             hFont = (HFONT) GetStockObject(ANSI_FIXED_FONT);
  13.             SendMessage(hEdit, WM_SETFONT, (UINT)hFont, TRUE );
  14.             /* les marges: */
  15.             SendMessage(hEdit, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(5,5));
  16.         return 0;
  17.         // afficher un msgBox quand on quitte en cas d'édition du texte , pour demander la confirmation
  18.         case WM_CLOSE:
  19.             if( !EditChg || MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
  20.                 DestroyWindow(hwnd);
  21.         return 0;
  22.         case WM_COMMAND:
  23.             // poster la le message quitter au Smenu IDM_QUIT est bien son id
  24.             if( LOWORD(wParam) == IDM_QUIT )    PostMessage(hwnd, WM_CLOSE, 0, 0);
  25.             // verifier si le texte à été éditer ou pas
  26.             if(HIWORD(wParam) == EN_CHANGE )  EditChg = TRUE;
  27.          return 0;
  28.         case WM_DESTROY:
  29.             PostQuitMessage(0);
  30.         return 0;
  31.         default:
  32.             return DefWindowProc(hwnd, uMsg, wParam, lParam);
  33.     }
  34. }


 
 
et ca marche
 

n°1425671
big_dadi_f​at
Posté le 15-08-2006 à 19:54:29  profilanswer
 

merci pour votre aide
 
 :hello:  
 
 
 


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

  résolu [API win32] probleme avec un petit exercice

 

Sujets relatifs
Problème création Base de donnéeP'tit problème de parse_error
Problème date et graphique[JSP] Problème de contexte
Problème avec nombre d'enregistrements dans une tableProblème de compatibilité: Sessions espace membre + Quiz Self Page!
[C]Problème d'inclusions imbriquées[LINUX] Probleme de gcc sous le terminal
[Résolu] Mon site n'est plus centré sous IE[Résolu] Centrage CSS et liste à image de fond
Plus de sujets relatifs à : résolu [API win32] probleme avec un petit exercice


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