Partage
  • Partager sur Facebook
  • Partager sur Twitter

API win32

problem avec un petit exercice

Sujet résolu
    15 août 2006 à 0:50:57

    Salut je débute en api win 32, et j'ai un petit prob avec un exercice.
    je veut fair 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


    #include<windows.h>

    #define L 600       // largeur de la fenetre principale
    #define H 400       // hauteur de la fenetre principale
    #define IDM_QUIT 1  // identificateur du SouMenu Quitter

    // prototype de la procédure
    LRESULT CALLBACK Proc(HWND, UINT, WPARAM, LPARAM);

    HINSTANCE hinst;    // hinstance du contrôl d'édition


    // LA FONCTION PRINCIPALE (MAIN) :

    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {

        HWND hwnd;              // hendle de la fenetre principale
        MSG msg;                // variable des messages pour la boucle
        WNDCLASS wc;            // structure (class) de la fenetre principale
        HMENU hMenu, hSousMenu; // hendle de menu et sousmenu

        // remplissage de la fenetre ******************************
        wc.style = 0;
        wc.lpfnWndProc = Proc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hinstance;
        wc.hIcon = LoadIcon(NULL, IDI_EXCLAMATION);
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = CreateSolidBrush(RGB(234,235,71));
        wc.lpszMenuNameNULL;
        wc.lpszClassName = "Class";

        // enregistrement de la class ******************************
        if ( !RegisterClass(&wc))    return FALSE;

        // SousMenu Quitter
        hSousMenu = CreateMenu();
        AppendMenu(hSousMenu, MF_STRING, IDM_QUIT, "Quitter");

        // Menu Fichier
        hMenu = CreateMenu();
        AppendMenu(hMenu, MF_POPUP, (UINT) hSousMenu, "Fichier");


        // création de la fenetre principale ******************************
        hwnd = CreateWindow("Class", "By Happy Hacker", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, L, H, NULL, hMenu, hinstance, NULL);

        // montrer les fenetres ******************************
        ShowWindow(hwnd, SW_SHOW)// montrer la fenetre principale

        // metre la fenetre principal à jours ******************************
        UpdateWindow(hwnd);

        // la boucle qui tréte les messages ******************************
        while (GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }


        return msg.wParam;
    }


    // LES FONCTIONS :

    LRESULT CALLBACK Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        static HWND hEdit;   // hendle du contôl d'édition
        static int EditNotChg;

        switch (uMsg)
        {
            case WM_CREATE:

                // création du contrôl d'édition
                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);

                /* la police d'édit: */
                HFONT hFont;
                hFont = (HFONT) GetStockObject(ANSI_FIXED_FONT);
                SendMessage(hEdit, WM_SETFONT, (UINT)hFont, TRUE );

                /* les marges: */
                SendMessage(hEdit, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(5,5));

            return 0;


            // afficher un msgBox quand on quitte en cas d'édition du texte , pour demander la confirmation
            case WM_CLOSE:
                if( EditNotChg || MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
                    DestroyWindow(hwnd);
            return 0;


            case WM_COMMAND:

                // poster la le message quitter au Smenu IDM_QUIT est bien son id
                if( LOWORD(wParam) == IDM_QUIT )    PostMessage(hwnd, WM_CLOSE, 0, 0);

                // verifier si le texte à été éditer ou pas
                if(HIWORD(wParam) == EN_CHANGE )     EditNotChg = FALSE;

             return 0;


            case WM_DESTROY:
                PostQuitMessage(0);
            return 0;


            default:
                return DefWindowProc(hwnd, uMsg, wParam, lParam);
        }
    }




    merci pour votre aide :)

    • Partager sur Facebook
    • Partager sur Twitter
      15 août 2006 à 1:06:31

      je dois admettre que je suis vachement fier de moi :)
      je n'ai jamais utilisé l'API win32 et j'ai reussi à trouver ton bug


      c'est la declaration de int EditNotChg; qui ne va pas, elle est mal placée

      je serais incapable de t'expliquer vraiment pourquoi :-° , mais si tu le declares juste avant le switch, ça marche

      Cordialement
      Nigel
      • Partager sur Facebook
      • Partager sur Twitter
        15 août 2006 à 1:14:12

        Bah non , meme comme ça , ca ne marche pas !!!



        • Partager sur Facebook
        • Partager sur Twitter
          15 août 2006 à 1:17:31

          bah merde, ça a marché, mais juste une fois :o
          ou alors je sais pas ce qui c'est passé

          non, j'ai fait une connerie
          j'ai utilisé la commande du menu deroulant... :-°

          EDIT:
          voilà, j'ai trouvé où se trouve un probleme
          si tu selectionnes ta zone de texte, ça marche, si tu quittes sans avoir cliqué à l'interieur de la zone de texte, il t'affiche quand meme le message

          je pense cependant que c'est juste un probleme lié à l'emplacement de l'initialisation de la variables
          • Partager sur Facebook
          • Partager sur Twitter
            15 août 2006 à 1:30:46

            je ne ponse pas , j'ai essayer mais :euh: .
            merci coméme


            • Partager sur Facebook
            • Partager sur Twitter
              15 août 2006 à 2:45:10

              Il y a 2 probleme avec ta variable EditNotchange, elle n'est pas initialiser, et d'autre part, a chaque fois que te rentre la fonction, elle doit se rapelle de la valeur precedante alors , il y a deux maniere de declarer cette variable pour que cela fonctionne 1ere facon (conseiller) est de declarer ta variable en static (en locale), ou alors tu declare ta variable en globale.
              • Partager sur Facebook
              • Partager sur Twitter
                15 août 2006 à 11:35:19

                Toujours utiliser static en api win32.

                En effet, le callback est une fonction appelée dès qu'il y a un message à traiter. Donc ta variable créée pendant le callback sera supprimée, puis créée de nouveau etc...
                • Partager sur Facebook
                • Partager sur Twitter
                  15 août 2006 à 14:50:44

                  snif
                  j'ai utiliser static don la procedur, mais c'est toujours le méme probléme.



                  :euh:
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 août 2006 à 15:03:52

                    Hem il faut que tu donnes le type BOOL à EditNotChange. (et l'initialiser bien sûr ... chose que tu n'as pas faite.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 août 2006 à 15:07:36

                      Citation : kidpaddle2

                      Hem il faut que tu donnes le type BOOL à EditNotChange. (et l'initialiser bien sûr ... chose que tu n'as pas faite.



                      :euh: c'est pareil , ca ne fonctionne pas avec BOOL.

                      je croi que ca vien du teste :
                      if( EditNotChg || MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
                                      DestroyWindow(hwnd);





                      avec un peut de chance ca devra marcher avec

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



                      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


                      :-°




                      EDIT: ca ne marche pas :( méme avec ca:

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




                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 août 2006 à 23:32:41

                        ET L'INITIALISER AUSSI...CHOSE QUE TU N'AS PAS FAITE :p (et je suis désolé mais la variable est encore de type int ...)

                        Je n'ai pas regardé le code en détail (pas regardé les messages de l'edit) mais ce la ne peut provenir que de là, ou alors de la condition de changement. (EN_CHANGE) Donc vérifie aussi que tu as bien pris le bon mot du bon apramètre etc...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 août 2006 à 18:28:13

                          enfait j'ai resolu le probléme grace à acryline :D


                          LRESULT CALLBACK Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
                          {
                              static HWND hEdit;   // hendle du contôl d'édition
                              static BOOL EditChg = FALSE;
                              switch (uMsg)
                              {

                                  case WM_CREATE:

                                      // création du contrôl d'édition
                                      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);

                                      /* la police d'édit: */
                                      HFONT hFont;
                                      hFont = (HFONT) GetStockObject(ANSI_FIXED_FONT);
                                      SendMessage(hEdit, WM_SETFONT, (UINT)hFont, TRUE );

                                      /* les marges: */
                                      SendMessage(hEdit, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(5,5));

                                  return 0;


                                  // afficher un msgBox quand on quitte en cas d'édition du texte , pour demander la confirmation
                                  case WM_CLOSE:
                                      if( !EditChg || MessageBox(hwnd, "texte modifié. Etes vous sur de vouloir quitter ?", "Question", MB_YESNO | MB_ICONQUESTION) == IDYES )
                                          DestroyWindow(hwnd);
                                  return 0;


                                  case WM_COMMAND:

                                      // poster la le message quitter au Smenu IDM_QUIT est bien son id
                                      if( LOWORD(wParam) == IDM_QUIT )    PostMessage(hwnd, WM_CLOSE, 0, 0);

                                      // verifier si le texte à été éditer ou pas
                                      if(HIWORD(wParam) == EN_CHANGE )     EditChg = TRUE;

                                   return 0;


                                  case WM_DESTROY:
                                      PostQuitMessage(0);
                                  return 0;


                                  default:
                                      return DefWindowProc(hwnd, uMsg, wParam, lParam);
                              }
                          }



                          voilà , et il marche bien :) .
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 août 2006 à 19:13:48

                            Citation : Bad-Day

                            static BOOL EditChg = FALSE;

                            Je l'avais dit pourtant... mais on m'écoute jamais.

                            La seule chose que tu as faite en plus de ce que j'ai dit, c'est inverser ta logique avec EditNotChg = TRUE qui change en FALSE ensuite -> EditChg = FALSE qui change en TRUE ensuite.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 août 2006 à 20:14:25

                              Citation : kidpaddle2

                              Citation : Bad-Day

                              static BOOL EditChg = FALSE;


                              Je l'avais dit pourtant... mais on m'écoute jamais.

                              La seule chose que tu as faite en plus de ce que j'ai dit, c'est inverser ta logique avec EditNotChg = TRUE qui change en FALSE ensuite -> EditChg = FALSE qui change en TRUE ensuite.



                              c'est vrai t'avais réson merci à toi kipaddle2


                              :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 août 2006 à 20:55:08

                                Tiens toi qui voulais savoir où en était le tuto... on se relit et il passe à l'épreuve "Validation" (j'en tremble :p ) demain.

                                P.S: Pense au tag résolu ;)
                                • Partager sur Facebook
                                • Partager sur Twitter

                                API win32

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown