Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Item dans un dialog en C

3 réponses
Avatar
Stéphane Baribeau
Bonjour à tous !

J'ai un peu besoin d'aide avec un dialog que je crée.

Voici le code :

void ouvrirDialog(void)
{
DialogPtr leDialog;
short itemHit;

leDialog = GetNewDialog(128,nil,(WindowPtr)-1);

if(itemHit == okButton)
{
SysBeep(10);
}
}

mais bon, ca ne semble pas fonctionner. Est-ce qu'il y aurait une raison ?
Je n'Arrive pas a comprendre le principe pour aller chercher le click du
boutton OK.

Merci si quelqu'un peut maider !

Bonne journée !

3 réponses

Avatar
testuz73
Stéphane Baribeau wrote:

Bonjour à tous !

J'ai un peu besoin d'aide avec un dialog que je crée.

Voici le code :

void ouvrirDialog(void)
{
DialogPtr leDialog;
short itemHit;

leDialog = GetNewDialog(128,nil,(WindowPtr)-1);

if(itemHit == okButton)
{
SysBeep(10);
}
}

mais bon, ca ne semble pas fonctionner. Est-ce qu'il y aurait une raison ?
Je n'Arrive pas a comprendre le principe pour aller chercher le click du
boutton OK.

Merci si quelqu'un peut maider !


Voyons, si je me rappelle bien il faut afficher le dialogue et s'il est
modal (seule fenêtre à réagir au clavier et à la souris) il devrait
exister une fonction ModalDialog, vérifie.

ps : si tu dois d'abord l'afficher, tu peux utiliser toutes les
fonctions qui utilise un WindowPtr avec le DialogPtr.

--
Frédéric Testuz
<mailto:

Avatar
Schmurtz
void ouvrirDialog(void)
{
DialogPtr leDialog;
short €€€itemHit€€€;

leDialog = GetNewDialog(128,nil,(WindowPtr)-1);

if(€€€itemHit€€€ == okButton)
{
SysBeep(10);
}
}


itemHit n'a jamais reçu de valeur, ça peut pas marcher. Tu le définis
(mais sans valeur précise), puis tout de suite tu le compare à autre
chose.

--
Schmurtz

Avatar
Louis Balourdet
Bonjour à tous !

J'ai un peu besoin d'aide avec un dialog que je crée.

Voici le code :

void ouvrirDialog(void)
{
DialogPtr leDialog;
short itemHit;

leDialog = GetNewDialog(128,nil,(WindowPtr)-1);

if(itemHit == okButton)
{
SysBeep(10);
}
}

mais bon, ca ne semble pas fonctionner. Est-ce qu'il y aurait une raison ?
Je n'Arrive pas a comprendre le principe pour aller chercher le click du
boutton OK.



L'essentiel est d'organiser ton code autour d'une boucle d'évenements
(EventLoop), selon le schéma ci-dessous.
C'est un extrait d'une étude faite il y a longtemps, qui permet d'utiliser
aussi des dialogues modeless ou movables, et de filtrer les dialogues (par
ex. pour n'accepter que des nombres entiers dans un champ éditable).

Bien que cela dépasse le cadre de ta question, tu pourras sans doute t'en
inspirer en plus simple.

Je n'ai extrait que l'essentiel pour comprendre la structure du programme.

void main(void)
{
ToolBoxInit();
WindowInit();
MenuInit();
GlobalsInit();
MaxApplZone();

EventLoop();
}

void EventLoop(void)
{
EventRecord event;

gDone = false;
while (! gDone)
{
if (WaitNextEvent (everyEvent, &event, 0, nil) )
DoEvent ( &event);
else
DoNullEvent( &event );
}
}

/*DoNullEvent est utile par exemple pour afficher des coordonnées selon la
position du curseur, où des curseurs spécifiques pour les champs
éditables.*/

void DoEvent(EventRecord *eventPtr)
{
if ( IsDialogEvent( eventPtr ) )
DoDialogEvent( eventPtr );

else switch ( eventPtr->what)
{
case mouseDown:
DoMouseDown(eventPtr);
break;
case keyDown:
case autoKey:
DoKey( eventPtr );
break;
case updateEvt:
DoUpdate (eventPtr);
break;
}

}

void DoDialogEvent( EventRecord *eventPtr )
{
DialogPtr dialog;
short item;
GrafPtr oldPort;

dialog = (DialogPtr)FrontWindow();

GetPort( &oldPort );
SetPort (dialog );

/* EventFilter renvoie true s'il a laissé passer l'event sans le traiter.
Il renvoie false quand il assure lui-même le traitement. L'intérêt de
DialogSelect est qu'il gère automatiquement les champs éditables, et le
tracking des boutons */

if (EventFilter( eventPtr, dialog ) )
{
if (DialogSelect( eventPtr, &dialog, &item ) )
if ( ( dialog ) != nil )
{
short iType;
Handle iHandle;
Rect iRect;

GetDialogItem( dialog, item, &iType, &iHandle, &iRect );

switch ( item )
{
case ok:
//traitement ad hoc
DisposeDialog(dialog);
case cancel:
DisposeDialog(dialog);
break;
}
}
}
SetPort( oldPort);
}


/***********************EventFilter***************************/

/* EventFilter renvoie true s'il laisse passer l'event sans le traiter.
Il renvoie false quand il assure lui-même le traitement
Si Cmd Key est appuyée, on émule Le menu Edit en renvoyant un FeedBack par
Delay(8, &ticks).
Si on ne filtrait pas cancel etc..., on récupererait le caractère dans le
champ éditable */

Boolean EventFilter( EventRecord *eventPtr, DialogPtr dialog )
{
unsigned long ticks;
char theChar;

switch( eventPtr->what )
{
case keyDown:
case autoKey:
theChar = eventPtr->message & charCodeMask;

if ( ( eventPtr->modifiers & cmdKey ) != 0 )
{
DoMenu( MenuKey( theChar ) );
Delay(8, &ticks);
HiliteMenu(0);
return( false );
}
else switch( theChar )
{
case 3: //Enter
case 13: //Return
FlipButton (dialog, ok);
EraseDialog(dialog);
return (false );
break;
case 27: //Escape
FlipButton (dialog, cancel);
EraseDialog(dialog);
return (false );
break;
}
break;
}
return (true );
}