Pb Fermeture Window intuition
14 sujets de 1 à 14 (sur un total de 14)
-
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.
Amos un jour, Amos Toujours
-----------------------------------
AmOS4 - Library Amos sous C (Os3-Os4)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
Amos un jour, Amos Toujours
-----------------------------------
AmOS4 - Library Amos sous C (Os3-Os4)ModCa 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…
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
Amos un jour, Amos Toujours
-----------------------------------
AmOS4 - Library Amos sous C (Os3-Os4)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 .
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
Courage!
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 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.
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 !!
…
…
…
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)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