![]()
![]()
![]()
![]()
![]()
Next: Bitmap Up: Primitives Graphiques Previous: Fenêtre   Contents   Index
Subsections
Événements
Attacher une fonction de rappel
Pour attacher une nouvelle procédure de rappel à une fenêtre, on utilise la fonction :
(ok:nom-callback! fenêtre procédure)où
nomest le nom de l'événement. Ainsi, on attache une nouvelle fonction de rappel procédure à la fenêtre. Le nombre et le type des paramètres de la procédure dépendent de l'événement, résumés dans le tableau ci-dessous :
(display mode)Le mode d'affichage de la fenêtre a changé. Le nouveau mode est passé en argument.(move x y)La fenêtre est déplacée par le gestionnaire de fenêtre. Les nouvelles coordonnées du coin en haut à gauche sont passées en arguments.(resize w h)Les dimensions de la fenêtre sont modifiées. Les nouvelles dimensions sont passées en arguments, la largeur en premier, la hauteur en second.(mouse x y)La souris est déplacée sur la fenêtre. La position de la souris relativement au coin en haut à gauche de la fenêtre sont passés en arguments.(press key)Une touche est pressée dans fenêtre. Le code de la touche est donné en argument. Les différents codes sont donnés plus bas.(release key)Une touche est relachée dans la fenêtre. Le code de la touche est donné en argument.(paint rectangle)La fenêtre doit être repeinte par l'application. Le rectangle à dessiner est donné en argument sous la forme d'un vecteur contenant ses coordonnées (x, y, largeur, hauteur).(refresh)La fenêtre doit être entièrement redessinée. Cet événement est émis pour un ou plusieurs événement paint.(in)La fenêtre reçoit le focus clavier.(out)La fenêtre perd le focus clavier.(delete)La fenêtre est détruite via le gestionnaire de fenêtre. En général, cela se produit en cliquant sur un bouton dans la barre de titre de la fenêtre.(enter)La souris entre dans la fenêtre.(leave)La souris quitte la fenêtre.(add child)Une fenêtre fille est crée dans la fenêtre. La fenêtre fille est passée en arguments.(del child)Une fenêtre fille est détruite. La fenêtre fille détruite est passée en argument.Par exemple, si nous voulons afficher un message à l'écran chaque fois que la souris entre dans la fenêtre, nous écrivons :
Osm> (ok:enter-callback! fenêtre (lambda () (format #t "entrée dans ~a\n" fenêtre)))
Obtenir une fonction de rappelPour obtenir la fonction de rappel attachée à une fenêtre, on utilise la fonction :
(ok:nom-callback fenêtre)Par défaut, lorsqu'une fenêtre est créée, une procédure sans effet est attachée au événements.
Pour chaîner les procédures, on peut utiliser le code :
Osm> (ok:enter-callback! fenêtre (let ([ancienne (ok:enter-callback fenêtre)]) (lambda () (ancienne) (format #t "entrée dans ~a\n" fenêtre))))L'utilisation de Scheme rend la programmation particulièrement aisée du fait de la gestion puissante de variables et des procédures.
Codage des touchesLes procédures de rappel liées aux événements
pressetreleasereçoivent comme argument un code de touche sous la forme d'un entier.Les fonctions suivantes permettent d'extraire l'information contenue dans le code de touche :
(ok:function? key): retourne#tsi le code concerne une touche de fonction,#fsinon.(ok:control? key): retourne#tsi la touche[CONTROL]est pressée,#fsinon.(ok:alt? key): retourne#tsi la touche[ALT]est pressée,#fsinon.(ok:shift? key): retourne#tsi la touche[SHIFT]est pressée,#fsinon.(ok:keypad? key): retourne#tsi la touche provient du pavé numérique,#fsinon.(ok:alpha? key): retourne#tsi la touche contient un code ASCII,#fsinon.Les fonctions suivantes permettent de construire un code de touche, en général pour effectuer des comparaisons :
(ok:control key): retourne le code de touche key, entier ou caractère, associé au code de la touche[CONTROL].(ok:alt key): retourne le code de touche key, entier ou caractère, associé au code de la touche[ALT].(ok:shift key): retourne le code de touche key, entier ou caractère, associé au code de la touche[SHIFT].(ok:alpha key): extrait le code ASCII du code key.Nous pourrions avoir comme gestionnaire d'événement :
Osm> (ok:press-callback! fenêtre (lambda (key) (let ([ascii (ok:alpha key)]) (cond [(and (ok:conrol? key) (eq? ascii #\a)) (display "CONTROL+A\n")] [(not (or (ok:conrol? key) (ok:shift? key) (ok:alt? key)) (if (char-alphabetic? ascii) (format #t "ASCII:~a\n" ascii))])))
![]()
![]()
![]()
![]()
![]()
Next: Bitmap Up: Primitives Graphiques Previous: Fenêtre   Contents   Index © 1993 to 2001 Erian Concept