IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

[LablGtk] GMisc.drawing_area et évènements


Sujet :

Caml

  1. #1
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut [LablGtk] GMisc.drawing_area et évènements
    Je voudrais être informé des évènements GdkEvent.Button dans un widget GMisc.drawing_area.

    • si j'ai bien compris je dois encapsuler mon drawing area dans un Gbin.event_box ? ou alors cette astuce n'est utile que pour les évènements GdkEvent.Key ?
    • pourquoi les coordonnées (x,y) sont elles float et non int ? ces coordonnées sont elles absolues ? ou relatives (à quoi ?)
    • est-ce que je peux simuler un drag-n-drap entre 2 portions (de simples tuiles carrées) d'un widget GMisc.drawing_area ?
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  2. #2
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonsoir,

    Je vais essayer de répondre à quelques-unes de tes questions. Dans l'ordre :


    • Concernant GMisc.drawing_area, il n'est pas nécessaire d'utiliser un GBin.event_box puisque tu as accès à area#event. En fait, un GtkDrawingArea est à peu près équivalent à une fenêtre X. C'est différent avec un objet comme GMisc.image par exemple, où la capture d'événements doit passer par GBin.event_box. Les objets qui nécessitent le recours à GBin.event_box : GtkAlignment, GtkArrow, GtkBin, GtkBox, GtkImage, GtkItem, GtkLabel, GtkPixmap, GtkScrolledWindow, GtkSeparator, GtkTable, GtkAspectFrame, GtkFrame, GtkVBox, GtkHBox, GtkVSeparator et GtkHSeparator.
    • Attention cependant... pour utiliser un événement tel que button_press, il faut d'abord l'ajouter à la liste des événements capturés. On utilise pour cela event#add avec la liste des événements souhaités. Un exemple ci-dessous, avec la partie importante en vert, comme de coutume (si cette ligne est commentée, le code ne fait plus ce qu'on attend de lui).
    • Pour les coordonnées données par GdkEvent.Button.x et GdkEvent.Button.y, le code ci-dessous devrait te convaincre qu'il s'agit des coordonnées relatives au bord supérieur gauche de l'objet GMisc.drawing_area (donc à sa fenêtre). Ces coordonnées sont en float en OCaml et en gdouble dans le code C, mais aucune justification ne me vient à l'esprit pour le moment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    open Printf
    
    let window =
      GMain.init ();
      let window = GWindow.window
        ~title:"GtkDrawingArea Demo"
        ~position:`CENTER
        ~width:300 ~height:300
        ~border_width:5 () in
      window#connect#destroy GMain.quit;
      window
    
    let frame = GBin.frame ~label:"Drawing area" ~packing:window#add ()
    
    let area = 
      let area = GMisc.drawing_area ~packing:frame#add () in
      area#event#add [`BUTTON_PRESS];
      area#event#connect#button_press (fun t -> 
        let x = truncate (GdkEvent.Button.x t)
        and y = truncate (GdkEvent.Button.y t) in
        printf "> Clic à (%d, %d).\n%!" x y; false);
      area
      
    let _ =
      window#show ();
      GMain.main ()
    Une version alternative avec motion_notify :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let area = 
      let area = GMisc.drawing_area ~packing:frame#add () in
      area#event#add [`POINTER_MOTION];
      area#event#connect#motion_notify (fun t -> 
        let x = truncate (GdkEvent.Motion.x t)
        and y = truncate (GdkEvent.Motion.y t) in
        ksprintf window#set_title "Curseur à (%d, %d)" x y; false);
      area
    Des infos plus détaillées sont disponibles ici. Pour le drag & drop, il faut que je me renseigne un peu.

    Cordialement,
    Cacophrène

Discussions similaires

  1. [lablGTK] Problème avec GMisc
    Par polow dans le forum Caml
    Réponses: 3
    Dernier message: 11/12/2011, 16h10
  2. [Lablgtk] Gestion événements
    Par elendril dans le forum Caml
    Réponses: 2
    Dernier message: 03/12/2011, 23h03
  3. Pas d'événement OnClose quand on arrête W2K
    Par Altau dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/01/2009, 18h36
  4. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  5. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo