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 :

Probleme g_signal_connect et recuperation position de la souris


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Par défaut Probleme g_signal_connect et recuperation position de la souris
    Tout d'abord bonsoir.

    Je post ce topic suite à de nombreuses difficultées que je rencontre lors de mon apprentissage de Gtk. (dans le cadre de mes études)

    J'essaye désespérément de récupérer la position du click de la souris sur une image mais mon g_signal_connect n'a pas l'aire de faire grand chose (je n'ai aucun message qui s'affiche dans ma console lors de mes frénétiques click sur mon image).
    Je sais qu'un topic a déjà été créer pour la récupération de la position de la souris mais si vous pouviez quand même me dire ce qui ne va pas ...

    Je vous remercie par avance pour le coup de main

    Mon code :
    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
    #include <stdlib.h>
    #include <goocanvas.h>
     
    gboolean on_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data);
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
        GtkWidget *pImage;
     
        gtk_init(&argc, &argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        gtk_window_set_title(GTK_WINDOW(pWindow), "GtkImage");
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        pVBox = gtk_vbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
        /* Chargement d'une image a partir d'un fichier */
        pImage = gtk_image_new_from_file("/home/berenger/Bureau/carte_europe.jpg");
        gtk_box_pack_start(GTK_BOX(pVBox), pImage, FALSE, FALSE, 5);
     
        gtk_widget_show_all(pWindow);
     
        g_signal_connect(G_OBJECT(pImage),"button_press_event",G_CALLBACK(on_button_press_event),NULL);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
     
    gboolean on_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data)
    {
    	if(event->type == GDK_BUTTON_PRESS)
    	{
    		g_print("x:%d y:%d\n",(int)event->x,(int)event->y);
    		return TRUE;
    	}
    	else
    	{
    		g_print("what else ?");
    		return FALSE;
    	}
    }
     
     
    //gcc -o toto toto.c `pkg-config --libs --cflags goocanvas`

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Les GtkImage ne peuvent recevoir le signal "button-press-event". Même s'ils héritent des GtkWidget.

    La solution est d'utiliser les GtkEventBox. Tu insères ton image dedans ensuite tu donnes les signaux que tu désires voir gérer par le GtkEventBox avec la fonction gtk_widget_add_events();. Typiquement GDK_BUTTON_PRESS_MASK pour ton code. Il ne te reste plus qu'à connecter "button_press_event" au GtkEventBox.

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Par défaut
    Merci je vais essayer sa en espérant que tout marche d'un coup

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 3
    Par défaut
    Ta solution marche parfaitement, encore merci.

    Pour ceux a qui mon code pourrait servir le voici:
    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
    #include <stdlib.h>
    #include <goocanvas.h>
     
    gboolean on_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data);
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *event_box;
        GtkWidget *pImage;
     
        gtk_init(&argc, &argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        gtk_window_set_title(GTK_WINDOW(pWindow), "GtkImage");
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
        /* Chargement d'une image a partir d'un fichier */
        pImage = gtk_image_new_from_file("/home/berenger/Bureau/carte_europe.jpg");
        event_box=gtk_event_box_new();
        gtk_container_add(GTK_CONTAINER(pWindow), event_box);
        gtk_container_add(GTK_CONTAINER(event_box), pImage);
     
        // On ajoute le signal "button_press_event" au GtkEventBox.
        gtk_widget_add_events(event_box,GDK_BUTTON_PRESS_MASK);
     
        // On attache un CALLBACK au widget event_box.
        g_signal_connect(G_OBJECT(event_box), "button_press_event", G_CALLBACK(on_button_press_event),  NULL);
     
        gtk_widget_show_all(pWindow);
     
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
     
    gboolean on_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data)
    {
    	if(event->type == GDK_BUTTON_PRESS)
    	{
    		g_print("x:%d y:%d\n",(int)event->x,(int)event->y);
    		return TRUE;
    	}
    	else
    	{
    		g_print("what else ?");
    		return FALSE;
    	}
    }

Discussions similaires

  1. recuperer position souris ie
    Par Doksuri dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 11/08/2011, 10h56
  2. Position de la souris
    Par abcd dans le forum Langage
    Réponses: 10
    Dernier message: 31/03/2005, 18h09
  3. Réponses: 3
    Dernier message: 16/08/2004, 10h57
  4. Déterminer la position de la souris
    Par genteur slayer dans le forum Composants VCL
    Réponses: 6
    Dernier message: 16/06/2003, 11h01
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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