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

GTK+ avec C & C++ Discussion :

Clic dans uen drawingArea située dans une scrolledWindow


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Clic dans uen drawingArea située dans une scrolledWindow
    Bonjour,

    je poste un message ici car cela fait quelques jours que je galère sur un problème avec GTK et C. Je cherches à récupérer la position d'un clic dans une zone de dessin située dans une fenêtre avec une barre de défilement verticale (GTK_SCROLLED_WINDOW). Le problème est le suivant: quel que soit l'état de la barre de défilement, le résultat de la fonction gdk_window_get_pointer, qui permet d'obtenir les coordonnées x et y d'un clic, ne change pas. Ainsi, que la fenetre de défilement soit tout en bas ou tout en haut, le résultat du clic sera toujours relatif à la fenetre du programme et non à la fenêtre de défilement, qui y est incluse.

    Je précise que le signal button_press_event est rattaché à la zone de dessin.

    Après quelques recherches, j'ai trouvé que grâce à la fonction gtk_scrolled_window_get_vadjustment, on pouvait obtenir une structure de type GtkAdjustment contenant normalement les paramètres relatifs à une barre de défilement. Ceux-ci sont toute fois inutilisable (ils changent à chaque fois) et leur valeur n'est pas logique à mon sens: L'un des champ s'appelle value et est sensé indiquer la position de la barre. Sa valeur de départ est 0, mais dès le premier "clic" de molette, sa valeur avoisine les milliards. quelques clics plus tard, on se retrouve dans les entiers négatifs du meme ordre de grandeur.

    Quelqu'un a-t-il déjà fait face à ce problème ? Si oui, j'aimerais qu'il me fasse partager son expérience de programmeur.

    Je vous remercie d'avance,

    Phyn04

    PS: désolé pour le double post je n'avais pas vu ce sous forum.

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par phyn04 Voir le message
    je poste un message ici car cela fait quelques jours que je galère sur un problème avec GTK et C. Je cherches à récupérer la position d'un clic dans une zone de dessin située dans une fenêtre avec une barre de défilement verticale (GTK_SCROLLED_WINDOW). Le problème est le suivant: quel que soit l'état de la barre de défilement, le résultat de la fonction gdk_window_get_pointer, qui permet d'obtenir les coordonnées x et y d'un clic, ne change pas. Ainsi, que la fenetre de défilement soit tout en bas ou tout en haut, le résultat du clic sera toujours relatif à la fenetre du programme et non à la fenêtre de défilement, qui y est incluse.
    ça me semble logique que ce soit du boulot du développeur de gérer le défilement.

    Citation Envoyé par phyn04 Voir le message
    Après quelques recherches, j'ai trouvé que grâce à la fonction gtk_scrolled_window_get_vadjustment, on pouvait obtenir une structure de type GtkAdjustment contenant normalement les paramètres relatifs à une barre de défilement. Ceux-ci sont toute fois inutilisable (ils changent à chaque fois) et leur valeur n'est pas logique à mon sens: L'un des champ s'appelle value et est sensé indiquer la position de la barre. Sa valeur de départ est 0, mais dès le premier "clic" de molette, sa valeur avoisine les milliards. quelques clics plus tard, on se retrouve dans les entiers négatifs du meme ordre de grandeur.
    De ce que je me rappel la démarche est bonne, il faudrait un peu de code (si possible complet et réduit au minimum) afin de tester mais je pencherai pour une erreur dans la signature de la fonction de rappel ou quelques chose dans ce genre là

    Citation Envoyé par phyn04 Voir le message
    PS: désolé pour le double post je n'avais pas vu ce sous forum.
    C'est nettoyé

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Voici le code que j'ai écris et qui devrais permettre de récupérer la "position" de la barre de défilement. Je n'ai pas encore codé l'algorithme de calcul des positions relatives du clic, mais cela sera sans problèmes une fois la position récupérée.
    GtkWidget *temp=NULL;
    GtkWidget* scrolledWindow=NULL;
    GtkAdjustment* adjj;
    gdouble val_temp;

    temp=gtk_widget_get_toplevel(widget);
    scrolledWindow=lookup_widget(GTK_WIDGET(temp),"scrolledwindow3");
    adjj= gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolledWindow));
    val_temp = adjj->value;
    printf("value: %d",val_temp);
    Voici les valeurs obtenues pour chaque pas de défilement. Je précise avoir initialiser la scrolled windows avec NULL comme paramètre pour hadjustment et vadjustment.

    0
    -1511193865
    -1511193865
    -59653575
    -1511193865
    666116570
    -59653575
    -785423720
    -1511193865
    1029001643
    666116570
    303231497

    Autre abération, on peut remarquer que plusieurs de ces chiffres, correspondant pourtant à des positions différentes, sont identiques.

    Sinon, je ne sais pas à quoi correspond la signature de la fonction de rappel.

    Merci.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Je ne peux rien faire avec un code aussi petit !

    Voici ce que j'ai fait, ce n'est pas très propre mais ça fonctionne :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <gtk/gtk.h>
     
    enum
    {
      H_SCROLL,
      V_SCROLL
    };
     
    static GtkWidget *label = NULL;
     
    gboolean scrolling (GtkRange *range, GtkScrollType scroll, gdouble value,
                        gpointer user_data)
    {
      gchar *text = NULL;
      static gdouble hvalue = 0;
      static gdouble vvalue = 0;
     
      switch (GPOINTER_TO_INT (user_data))
      {
        case H_SCROLL:
          hvalue += value;
        break;
        case V_SCROLL:
          vvalue += value;
        break;
      }
      text = g_strdup_printf ("%f - %f", hvalue, vvalue);
      gtk_label_set_text (GTK_LABEL (label), text);
      g_free (text);
      return TRUE;
    }
     
    int main (gint argc, gchar **argv)
    {
      GtkWidget *window = NULL;
      GtkWidget *scroll = NULL;
     
      gtk_init (&argc, &argv);
     
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);
     
      scroll = gtk_scrolled_window_new (NULL, NULL);
      gtk_container_add (GTK_CONTAINER (window), scroll);
     
      label = gtk_label_new ("0 - 0");
      gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scroll), label);
      g_signal_connect (G_OBJECT (GTK_SCROLLED_WINDOW (scroll)->hscrollbar),
                        "change-value", G_CALLBACK (scrolling), H_SCROLL);
      g_signal_connect (G_OBJECT (GTK_SCROLLED_WINDOW (scroll)->vscrollbar),
                        "change-value", G_CALLBACK (scrolling), V_SCROLL);
     
      gtk_widget_show_all (window);
      gtk_main ();
      return 0;
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord, merci pour ta réponse.
    Je viens de tester ton programme et effectivement, il détecte bien un défilement se faisant grâce à la molette lorsque le pointeur est situé sur la scrollbar. Cependant, j'ai remarqué que l'on ne pouvais plus bouger la scrollbar avec la souris (lorsque l'on essaye, la valeur renvoyée augmente sans cesse) et le scroll ne se fait pas dans le widget enfant contenu dans la scrolledWindow.
    D'autre part, lorsque l'on fait défiler avec la molette et avec le pointeur sur le widget enfant, on voit bien la scrollbar se modifier et la fenetre défiler, mais par contre la valeur du scroll ne varie plus.

    Le résultat est-il le même chez toi ?

    Phyn04

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/04/2014, 15h08
  2. Réponses: 4
    Dernier message: 27/05/2013, 16h02
  3. [Débutant] Charger un graphe dans un axes situé dans une figure
    Par zouhiba dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 12/05/2013, 13h29
  4. Réponses: 5
    Dernier message: 09/10/2008, 14h26
  5. Réponses: 2
    Dernier message: 26/03/2008, 14h59

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