Pb Fermeture Window intuition

14 sujets de 1 à 14 (sur un total de 14)

  • Sharynn

      #8348

      Salut !!!

      J’ai un petit soucis avec ma routine de fermeture de fenêtre intuition.. En effet, l’appel du message semble ne pas fonctionner ( getmsg() ).

      Avez vous un bout de source en C qui ferme la fenêtre en utilisant le gadget fermeture et le message du Userport.

      Merci d’avance. :-D

      Amos un jour, Amos Toujours
      -----------------------------------
      AmOS4 - Library Amos sous C (Os3-Os4)

      leo

        #128455

        Si tu pouvais poster un bout de code que tu utilises ca pourrait aider je pense…

        Sharynn

          #128456

          Voici la Zone en litige!!

          ……

          Fin_prog = FALSE;

          //

          while( Fin_prog == FALSE )

          {

          Wait( 1 << Window1->UserPort->mp_SigBit );

          my_message = (struct IntuiMessage *) GetMsg( Window1->UserPort );

          if(my_message)

          {

          class = my_message->Class;

          ReplyMsg( my_message );

          if( class == CLOSEWINDOW )

          Fin_prog=TRUE;

          }

          }

          ……..

          Le WAIT semble ne pas fonctionner car il trouve rien…

          Sans le Wait, aucun message n’est détecté quand je clique sur le gadget CLOSEWINDOW

          :-D

          Amos un jour, Amos Toujours
          -----------------------------------
          AmOS4 - Library Amos sous C (Os3-Os4)

          henes

            #128457

            my_message = (struct IntuiMessage *) GetMsg( Window1->UserPort );

            if(my_message)

            Remplace ces deux lignes par celle ci :

            while((my_message = (struct IntuiMessage *) GetMsg( Window1->UserPort ))

            Mod

            Tcheko

              #128458

              Salut,

              Une élément indispensable pour programmer : la documentation !

              Une référence pour l’API : API 3.1 sur UtilityBase.

              ++

              Gilloo

                #128459

                Ca ne serait pas la variable my_message qui pose porblème ?

                Vu qu’il n’y a qu’un port en attente autant utiliser WaitPort()

                ULONG class = 0 ;

                BOOL Fin_prog = FALSE;

                struct IntuiMessage *my_message ;

                while(!Fin_prog)

                {

                WaitPort(Window1->UserPort);

                do

                {

                my_message = (struct IntuiMessage *) GetMsg(Window1->UserPort );

                if(my_message != NULL)

                {

                class = my_message->Class;

                ReplyMsg((struct Message*)my_message );

                switch (class)

                {

                case CLOSEWINDOW :

                Fin_prog = TRUE ;

                break ;

                default :

                break ;

                }

                }

                } while (my_message != NULL) ;

                }

                Bonne programmation, petit scarabée…

                Sharynn

                  #128460

                  Merci pour votre aide !!!

                  Toutefois, mon programme ne dépasse pas la ligne WaitPort quoi que je fasse…

                  J’ai beau retirer cette ligne, la routine tourne indéfiniment sans pouvoir trouver aucun message…

                  Auriez vous mes amis un code qui ouvre et ferme une fenetre intuition dans vos tiroir que je puisse étudier votre façon de faire…

                  Une qource qui aurait été testé chez vous

                  Il se peut que mes includes soient mauvais, mais bon j’en doute!!

                  De plus je désirerai une attente dynamique que je puisse faire des chose durant cette attente.. vous voyez ce que je veux dire !!

                  Salut :-D

                  Amos un jour, Amos Toujours
                  -----------------------------------
                  AmOS4 - Library Amos sous C (Os3-Os4)

                  centaurz

                    #128461

                    @sharynn

                    As tu bien spécifié que tu souhaites recevoir les messages CLOSEWINDOW (mets le programme complet) ?

                    Regarde sur Aminet les exemples des Rom Kernel Manual, tu trouveras sûrement ton bonheur et plein d’autres tutoriels.

                    Et sinon, que souhaites tu faire dans ta boucle de programme ? Tout est déjà prêt pour :-).

                    Gilloo

                      #128462

                      Dans ce cas montre nous le code qui ouvre la fenêtre.

                      Il doit manquer un IDCMP dans la définition (un truc comme IDCMP_CLOSEWINDOW (et aussi un flag WFLG_CLOSEGADGET))

                      Il y a deux façons d’ouvrir une fenêtre

                      – OpenWindow

                      – OpenWindowTags (OpenWindowTagList à la sauce C)

                      La première fonctionne avec tous les OS, la seconde uniquement à partir du WB 2.04.

                      Tout dépend de ce que tu veux faire avec ta fenêtre

                      :-D Courage!

                      Sharynn

                        #128463

                        OK OK , Je pense faire la bonne chose !!! voici mon programme

                        struct Window *Window1 = NULL;

                        struct IntuiMessage *my_message;

                        #define Wname “Library Version Checker V0.1”

                        BOOL Fin_Prog;

                        ULONG class;

                        //


                        // Début des routines

                        //


                        int main(int argc, char *argv[])

                        {

                        // Ouverture Fenetre et mise en place des gadget

                        Window1 = (struct Window *) OpenWindowTags( NULL,

                        WA_Left, 600,

                        WA_Top, 300,

                        WA_Width, 100,

                        WA_Height, 100,

                        WA_Title, Wname,

                        WA_DepthGadget, TRUE,

                        WA_CloseGadget, TRUE,

                        WA_SizeGadget, NULL,

                        WA_DragBar, TRUE,

                        TAG_END );

                        printf(“Window OKn”);

                        Fin_Prog = FALSE;

                        //


                        // Boucle de travail en attente de fermeture

                        //


                        while(!Fin_Prog)

                        {

                        printf(“1n”); // Pour Debug

                        WaitPort(Window1->UserPort);

                        printf(“2n”);// Pour Debug

                        do

                        {

                        my_message = (struct IntuiMessage *) GetMsg(Window1->UserPort );

                        if(my_message != NULL)

                        {

                        printf(“3n”);// Pour Debug

                        class = my_message->Class;

                        ReplyMsg((struct Message*)my_message );

                        switch (class)

                        {

                        case CLOSEWINDOW :

                        Fin_Prog = TRUE ;

                        break ;

                        default :

                        break ;

                        }

                        }

                        }

                        }

                        }

                        Il se compile sans erreur, mais ne depasse pas le numéro 2

                        Amos un jour, Amos Toujours
                        -----------------------------------
                        AmOS4 - Library Amos sous C (Os3-Os4)

                        Alex

                          #128464

                          Est-ce qu’il ne manquerait pas un

                          WA_IDCMP, IDCMP_CLOSEWINDOW

                          dans la création de la fenêtre ?

                          Gilloo

                            #128465

                            Alex a écrit :

                            Est-ce qu’il ne manquerait pas un

                            WA_IDCMP, IDCMP_CLOSEWINDOW

                            dans la création de la fenêtre ?

                            Ben oui, il manque la définition des IDCMP!

                            Pis aussi il faudrait un if (Window1 != NULL) { … } après l’appel à OpenWindowTags, histoire de ne pas tout faire planter au cas où le système ne puisse pas créer la fenêtre. Imagine que tu ouvres une fenêtre 600×230 sur un écran 320×200 et bing guru vu que Window1 vaudra NULL en cas d’échec.

                            Sharynn

                              #128466

                              Moi je dis bravo!!!! j’ai oublié le IDCMP !!!

                              Après 15 ans de programmation sur AMIGA (tous programmes confondus), je reste un novice en C.

                              Je test et je vous tiens au courant !! :-D

                              OK ça fonctionne… Juste une question durant l’attente le programme reste figé sur le waitport ?, je ne peu donc rien faire ?

                              Amos un jour, Amos Toujours
                              -----------------------------------
                              AmOS4 - Library Amos sous C (Os3-Os4)

                              centaurz

                                #128467

                                Si, mais cela dépend de ce que tu veux faire. Comme tu es en multi-tâche, ta boucle principale n’est exécutée que quand Intuition t’envoie un message et réveille ton programme. Donc il faut que tu traites d’autres évènements IDCMP.

                                Par exemple, le message qui t’indique de redessiner la fenêtre :

                                Modifie ces tags :

                                WA_IDCMP, IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,

                                WA_SizeGadget, TRUE

                                Et ajoute le traitement du message :

                                case IDCMP_REFRESHWINDOW:

                                BeginRefresh(Window1);

                                SetAPen(Window1->RPort, 3);

                                RectFill(Window1->RPort, BorderLeft, BorderTop, Window1->Width – 1, Window1->Height – 1);

                                EndRefresh(Window1, TRUE);

                                break;

                                ça devrait normalement colorier ta fenêtre (bon, c’est pas testé…).

                              14 sujets de 1 à 14 (sur un total de 14)

                              • Vous devez être connecté pour répondre à ce sujet.

                              Forums AmigaOS, MorphOS et AROS Développement Pb Fermeture Window intuition

                              Amiga Impact