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

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

Marsh Posté le 15-08-2006 à 01:06:53    

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
Reply

Marsh Posté le 15-08-2006 à 01:06:53   

Reply

Marsh Posté le 15-08-2006 à 09:46:15    

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

Reply

Marsh Posté le 15-08-2006 à 09:51:23    

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

Reply

Marsh Posté le 15-08-2006 à 10:02:04    

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é...

Reply

Marsh Posté le 15-08-2006 à 14:21:37    

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

Reply

Marsh Posté le 15-08-2006 à 15:21:51    

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.  :(  
 
 

Reply

Marsh Posté le 15-08-2006 à 15:27:21    

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
Reply

Marsh Posté le 15-08-2006 à 15:34:50    

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:  
 
 
 

Reply

Marsh Posté le 15-08-2006 à 15:38:15    

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

Reply

Marsh Posté le 15-08-2006 à 15:51:28    

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
 
 
 

Reply

Marsh Posté le 15-08-2006 à 15:51:28   

Reply

Marsh Posté le 15-08-2006 à 15:53:47    

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
Reply

Marsh Posté le 15-08-2006 à 16:03:23    

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
 

Reply

Marsh Posté le 15-08-2006 à 19:54:29    

merci pour votre aide
 
 :hello:  
 
 
 

Reply

Sujets relatifs:

Leave a Replay

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