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 :

Position de la souris


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut Position de la souris
    Bonjour à tous.

    J'ai dans mon projet besoin de récupérer la position de la souris. J'ai réussi à récupérer et à bricoler la fonction suivante :

    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
    void PositionSourisEcran( GtkWidget *widget, GdkEventMotion *event)
    {
        gint x1, y1;
        gint x2, y2;
        int coord[MAX_LIGNE][MAX_COLONNE];
     
        /* Position dans la fenêtre */
        if (event->is_hint)
            gdk_window_get_pointer (event->window, &x1, &y1, NULL);
        else
        {
            x1 = event->x;
            y1 = event->y;
        } 
        /* Position dans l'écran */
        if (event->is_hint)
            gdk_window_get_pointer (gdk_screen_get_root_window(gdk_screen_get_default()),&x2, &y2, NULL);
        else
        {
            x2 = event->x_root;
            y2 = event->y_root;
        }
    /*RECUPERATION DES COORDONNEES ICI*/
    	coord[0][0]=x1;
    	coord[0][1]=y1;
    	coord[0][2]=x2;
    	coord[0][3]=y2;
    	printf("%d \t%d\n %d\t %d\n",coord[0][0],coord[0][1],coord[0][2],coord[0][3]);
     
    }
    Le problème est le suivant. Il m'affiche ca dans la console à la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: 'struct _GdkEventButton' has no member named 'is_hint'
    J'ai fait des recherches et apparemment, on peut utiliser ce genre de truc que si un ou plusieurs bouton sont enfoncés. Ca m'a paru super bizarre mais apparemment ca a l'air d'être vrai.
    Ca marchait avant puisque je chargeais une image sur clic d'un bouton et apres je pouvais récupérer la position.

    Par contre maintenant, je n'ai absolument plus de bouton pour charger puisque j'arrive à mettre à jour l'image sur clic de l'image elle-même (que j'ai mise dans une Eventbox).

    J'ai pensé rajouter un bouton factice invisible que j'activerais tout le temps histoire de pouvoir récupérer la position de mon curseur quand je veux mais le soucis c'est que j'arrive pas à faire ca et je me demande meme si c'est faisable.
    Le cas échéant, quelqu'un aurait une idée?

    PS : précisioin, dans mon main je connecte mon signal de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(pEBox), "button_press_event", G_CALLBACK(ChargementImage), &paramEBox);
    pEBox est mon Eventbox et la ChargementImage est une fonction qui fait plusieurs choses et dans laquelle j'ai inclu quasi textuellement la fonction PositionSouris

  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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Le bon signal est motion-notify-event

    Pour éviter les problèmes, n'oublie pas que la fonction callback doit renvoyer un boolean afin de préciser si le signal doit être propagé ou non

  3. #3
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    Salut gégé
    Et merci pour ta réponse.

    Alors j'ai opéré deux modifs.

    ___La première, ce que tu m'as dit. En effet, les Eventbox elles aiment pas trop les évènements BUTTON_PRESSED.

    __La seconde, c'est dans les arguments de ma fonction ChargementImage.

    Avant, c'est ca :
    void PositionSourisEcran( GtkWidget *widget, GdkEventButton *event);
    d'ou l'erreur que j'ai mise dans mon post précédent.

    J'ai changé en GdkEventMotion et là plus de problème à la compile.

    Par contre et puisque les problèmes ne viennent jamais seuls, je n'arrive à avoir la position de mon curseur en même temps que le chargement d'une nouvelle image qu'en cliquant comme un goret sur l'image. Et j'obtiens pas 4 coordonnées (comme je le veux) mais 4 fois 5 ou 6 ou 7, ca dépend de je ne sais quoi.

    Alors soit ca a un rapport avec les évènements, soit avec les masques.
    En précisant dans la connexion du signal MOTION_NOTIFY_EVENT et dans le masque :
    * GDK_POINTER_MOTION_MASK -> l'image se charge et les coordonnées affluent au moindre mouvement de la souris. -> IMBUVABLE
    * GDK_POINTER_MOTION_HINT_MASK-> c'est là que je suis obligé de cliquer comme un goret pour avoir non pas 4 coordonnées mais beaucou plus (avec par contre un et un seul changement d'image) -> ASSEZ STRESSANT

    Je pense avoir été précis
    Une autre idée ?

  4. #4
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    Pour info, j'ai même tenté la technique de sioux consistant à insérer une Eventbox dans une autre EvenBox et d'associer du coup un évènement à chaque Eventbox mais je le déconseille tout de suite à ceux qui n'y avaient pas encore pensé...

  5. #5
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    Voila la fonction ChargementImage ainsi que le main, si ca peut aider...

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    gboolean ChargementImage(GtkWidget *widget, GdkEventMotion *event, gpointer data)
    {
     
     
    gint x1, y1;
        gint x2, y2;
        int coord[MAX_LIGNE][MAX_COLONNE];
    //Création du nom de l'image
    	int i;
    	char nom_image[10];
    	//Mise à jour du label et de l'image
    	ParamEBox* paramEBox;
     
    	//On charge dans paramEBox les paramètres passés en argument
    	paramEBox = (ParamEBox*)data;
     
     
    /* Position dans la fenêtre */
        if (event->is_hint)
            gdk_window_get_pointer (event->window, &x1, &y1, NULL);
        else
        {
            x1 = event->x;
            y1 = event->y;
        } 
        /* Position dans l'écran */
        if (event->is_hint)
            gdk_window_get_pointer (gdk_screen_get_root_window(gdk_screen_get_default()),&x2, &y2, NULL);
        else
        {
            x2 = event->x_root;
            y2 = event->y_root;
        }
    /*RECUPERATION DES COORDONNEES ICI*/
    	coord[0][0]=x1;
    	coord[0][1]=y1;
    	coord[0][2]=x2;
    	coord[0][3]=y2;
    	printf("%d \t%d\n %d\t %d\n",coord[0][0],coord[0][1],coord[0][2],coord[0][3]);
     
     
     
    	/** Mise à jour du label **/
    	gtk_label_set_label(GTK_LABEL(paramEBox->Label), "Il reste 4 secondes.");
     
    	/** Mise à jour de l'image **/
    	srand(time (NULL));
    	i = rand() % 8;
     
    	sprintf(nom_image,"%d",i);
    	strcat(nom_image,".png");
    	gtk_image_set_from_file(GTK_IMAGE (paramEBox->Image), nom_image);
     
    	return TRUE;
    }
    /***********************************************************************************************/
    // Callback Quitter
    void quit(GtkWidget* pBouton, gpointer pNull)
    {
         gtk_main_quit();
    }
     
    // Fonction main
    int main(int argc,char **argv)
    {
    	// Declaration des objets
    	GtkWidget *pFenetre;           // Fenêtre
    	GtkWidget *pLabelEtat1;             // Label 
    	GtkWidget *pLabelEtat2;             // Label 
    	GtkWidget *pBoutonDemarrer;    // Bouton 1
    	GtkWidget *pBoutonQuitter;     // Bouton 2
    	GtkWidget *pVBox;    // Boîte
    	GtkWidget *pHBox;    // Boîte
    	GtkWidget *pEBox;
    	GtkWidget *pImage;
    	GtkWidget *pSeparateur1;
    	GtkWidget *pSeparateur2;
     
     
    	ParamEBox paramEBox;
     
    	// Initialisation de l'environnement Gtk
    gtk_init(&argc, &argv);
     
    	// Creation des objets
    	pFenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_default_size( GTK_WINDOW(pFenetre), 500, 500);
    	gtk_window_set_position( GTK_WINDOW(pFenetre), GTK_WIN_POS_CENTER_ALWAYS);
    	pLabelEtat1 = gtk_label_new("Bonjour ! Appuyer sur 'Demarrer' pour commencer le test.");
    	pLabelEtat2 = gtk_label_new("Il reste 5 secondes.");
    	pBoutonDemarrer = gtk_button_new_with_mnemonic("_Demarrer");
    	pBoutonQuitter = gtk_button_new_with_mnemonic("_Quitter");
    	pVBox = gtk_vbox_new(FALSE,0);
    	pHBox = gtk_hbox_new(FALSE,0);
    	pEBox=gtk_event_box_new();
     	pSeparateur1 = gtk_hseparator_new();
    	pSeparateur2 = gtk_hseparator_new();
    	pImage = gtk_image_new();
    	gtk_container_add(GTK_CONTAINER(pEBox), pImage);
    	gtk_image_set_from_file(GTK_IMAGE (pImage), "2.png");
     
     
    	//Mise à jour de la structure
    	paramEBox.Label = pLabelEtat2;
    	paramEBox.Image = pImage;
     
    	// Paramamétrage des objets
    	gtk_window_set_title(GTK_WINDOW(pFenetre), "AVANT-PROJET : Prise de mesures");
     
    	// Association de la boîte à la fenêtre
    	gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);
     
    	// Association des différents objets à la boîte horizontale
    	gtk_box_pack_start(GTK_BOX(pHBox), pBoutonDemarrer, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(pHBox), pBoutonQuitter, FALSE, FALSE, 0);
     
    	// Association des différents objets à la boîte verticale
    	gtk_box_pack_start(GTK_BOX(pVBox), pHBox, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(pVBox), pSeparateur1, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(pVBox), pLabelEtat1, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(pVBox), pLabelEtat2, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(pVBox), pSeparateur2, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(pVBox), pEBox, FALSE, FALSE, 0);
     
    	// On associe la fonction gtk_main_quit au signal de fermeture de la fenêtre
    	gtk_signal_connect(GTK_OBJECT(pFenetre), "destroy", G_CALLBACK(quit), NULL);
     
    	// Connexion des signaux
    	gtk_signal_connect(GTK_OBJECT(pBoutonDemarrer), "clicked", G_CALLBACK(CommencerTest), pLabelEtat1);
    	gtk_signal_connect(GTK_OBJECT(pBoutonQuitter), "clicked", G_CALLBACK(quit), NULL);
    	g_signal_connect(G_OBJECT(pEBox), "motion-notify-event", G_CALLBACK(ChargementImage), &paramEBox);
     
    	gtk_widget_set_events (pEBox, GDK_POINTER_MOTION_HINT_MASK);
     
    	// Affichage de la fenetre
    	gtk_widget_show_all(pFenetre);
     
    	// Lancement de la boucle évènementielle
    	gtk_main();
     
        return 0;
    }

  6. #6
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    Bonjour.

    C'est quasiment le dernier truc qui me pose problème pour la première appli que j'ai à réaliser dans mon projet. Si quelqu'un a ne serait-ce qu'une petite idée, je suis vraiment preneur.

    Bonne journée tout le monde.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. nom d'un controle et position de la souris
    Par manu80000 dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2006, 16h12
  2. [C#]Drag & Drop, problème de position de la souris
    Par debug dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/10/2005, 13h06
  3. Position de la souris
    Par abcd dans le forum Langage
    Réponses: 10
    Dernier message: 31/03/2005, 18h09
  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