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++

  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 : 41
    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.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    J'ai rien compris à ce que tu voulais faire... Tu veux récupérer la position de la souris, ça ok, mais quand ? Je pensais que tu la voulais en permanence et que c'était la raison pour laquelle tu utilisais un motion event, mais visiblement c'est pas ça que tu veux... Donc si tu pouvais décrire un peu mieux ce que tu veux faire, on pourra peut être t'aider Une explication du genre "quand [...] je veux la position de la souris pour [...], et ensuite quand [...] je veux la récupérer une seconde fois pour [...]"

  8. #8
    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
    Pas de problème! Voici une explication plus détaillée.

    Fonctionnement général : Une série d'images s'affiche. L'utilisateur doit cliquer sur l'image pour passer à la suivante. Les coordonnées du clic sont enregistrées. L'utilisateur DOIT regarder l'image avant de cliquer, cad qu'on l'empeche de cliquer à tout va.

    Mon problème est le suivant. J'ai une image. Je veux qu'au clic sur l'image, il se passe plusieurs choses:
    _ enregistrement des coordonnées du curseur
    _ chargement d'une nouvelle image
    _ empecher le clic pendant x secondes
    La bonne nouvelle c'est que j'arrive à tout faire.

    Pour arriver à charger une autre image par exemple, j'ai du insérer l'image (que je mets à jour au fur et à mesure) dans une Eventbox. Donc au clic (MOTION_NOTIFY_EVENT) sur cette Eventbox j'apelle une fonction qui va se charger de faire tout ca (la fonction en question est ChargementImage).
    Le problème est que je suis obligé de cliquer comme un ane (beaucoup de fois) sur ma souris pour que mon callback soit appelé. Des fois ca marche, des fois ca marche pas. Et quand ca marche, des fois un seul clic a été pris en compte, des fois 3 d'un coup!
    Tout le traitement qui suit fonctionne.

    Dans le main, je connecte le signal de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect(G_OBJECT(pEBox), "motion-notify-event", G_CALLBACK(ChargementImage), &paramEBox);
    Je règle le masque de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gtk_widget_set_events (pEBox, GDK_POINTER_MOTION_HINT_MASK);
    J'ai essayé avec GDK_POINTER_MOTION_MASK mais là le callback est appelé au moindre mouvement de la souris. Moi je voudrais juste faire UN clic.

    Voila je pense avoir exposé le problème assez précisément. Donc je ne sais pas d'ou peut venir le probleme. Peut-être dans le fait d'insérer l'image dans une Eventbox, du coup les évènements se passeraient moins bien..j'en sais rien du tout.

    J'espère avoir été plus clair..

    Voila le code si ca peut servir...
    2fonctions : DesactiverEBox et ChargementImage
    et le main

    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
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
     
    gboolean  DesactiverEBox (gpointer pEBox)
    {
     
            decompteur++;
            printf("Entree dans DesactiverEBox\n");
            if (decompteur <= 5)
            {
                    gtk_widget_set_sensitive (GTK_WIDGET (pEBox), FALSE);
                    return TRUE;
            }
            else
            {       
                    decompteur=1;
                    gtk_widget_set_sensitive (GTK_WIDGET (pEBox), TRUE);
                    return FALSE;
            }
    }
     
    gboolean ChargementImage(GtkWidget *pEBox, GdkEventMotion *event, gpointer data)
    {
     
            #ifdef DEBUG
            printf("Entree dans ChargementImage\n");
            #endif
     
            //Fichier log
            FILE* fp;
            //Position souris
            gint x1, y1;
            gint x2, y2;
            int coord[MAX_LIGNE][MAX_COLONNE];
            //Création du nom de l'image
            int i;
            char nom_image[256];
            //Mise à jour du label et de l'image
            ParamEBox* paramEBox;
            char nouveau_label[256];
     
            //On charge dans paramEBox les paramètres passés en argument
            paramEBox = (ParamEBox*)data;
     
            if (cpt_image <= 10)
            {
                    /** Mise à jour des labels **/
                    sprintf(nouveau_label,"Image n %d",cpt_image);
                    gtk_label_set_label(GTK_LABEL(paramEBox->Label1), nouveau_label);
                    gtk_label_set_label(GTK_LABEL(paramEBox->Label2), "Decompteur a realiser.");
     
                    /** 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);
     
                    /** Attente **/ 
                    printf("Avant le timeout\n");
                    g_timeout_add (1000, (gpointer)DesactiverEBox, pEBox);
                    printf("Apres le timeout\n");
     
                    /** Position de la souris **/
                    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;
                    }
     
                    /*Stockage des coordonnées*/
                    coord[0][0]=x1;
                    coord[0][1]=y1;
                    coord[0][2]=x2;
                    coord[0][3]=y2;
     
                    //Ecriture des coordonnées sur dans le shell et le fichier texte
                    printf("%d %d %d %d\n",coord[0][0],coord[0][1],coord[0][2],coord[0][3]);
     
                    fp=fopen("log.txt","a");
     
                    fprintf(fp,"%d %d %d %d\n",coord[0][0],coord[0][1],coord[0][2],coord[0][3]);
     
                    fclose(fp);
     
                    cpt_image++;
     
            }
            else//Le test est fini
            {
                    gtk_label_set_label(GTK_LABEL(paramEBox->Label1), "Le test est termine. Vous pouvez quitter.");
                    gtk_label_set_label(GTK_LABEL(paramEBox->Label2), "Vous pouvez egalement commencer un nouveau test.");
                    DebutTestPossible = TRUE;
                    cpt_image=1;
                    gtk_widget_set_sensitive (GTK_WIDGET (pEBox), FALSE);
     
            }
     
            #ifdef DEBUG
            printf("Sortie de ChargementImage\n");
            #endif
     
            return TRUE;
    }
    /***********************************************************************************************/
     
    // 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;
            ParamBoutonDemarrer paramBoutonDemarrer;
     
            // 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 'Nouveau' pour vous enregistrer et debuter le test");
            pLabelEtat2 = gtk_label_new("");
            pBoutonDemarrer = gtk_button_new_from_stock(GTK_STOCK_NEW);
            pBoutonQuitter = gtk_button_new_from_stock(GTK_STOCK_QUIT);
            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_image_set_from_file(GTK_IMAGE (pImage), "1.png");
            gtk_container_add(GTK_CONTAINER(pEBox), pImage);
     
            //Désactivation de l'EventBox car le test ne commence pas tout de suite
            gtk_widget_set_sensitive (GTK_WIDGET (pEBox), FALSE);
     
            //Mise à jour des structures
            paramEBox.Label1 = pLabelEtat1;
            paramEBox.Label2 = pLabelEtat2;
            paramEBox.Image = pImage;
            paramBoutonDemarrer.Fenetre = pFenetre;
            paramBoutonDemarrer.EBox = pEBox;
     
            // 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(gtk_main_quit), NULL);
            gtk_signal_connect(GTK_OBJECT(pBoutonDemarrer), "clicked", G_CALLBACK(ClicDemarrer), &paramBoutonDemarrer);
            gtk_signal_connect(GTK_OBJECT(pBoutonQuitter), "clicked", G_CALLBACK(gtk_main_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;
    }

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Ah... Si tu veux détecter les clics de souris, motion-notify n'est clairement pas le signal adapté vu que le but de ce signal est de t'indiquer les déplacements de la souris. C'est bien button-pressed-event que tu veux (ou button-released-event). Je sens qu'on va retomber sur ton problème initial par contre

  10. #10
    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
    WAZAAAAA!!

    Merci Teuf!! Tu as mis le doigt là ou il fallait!

    J'ai résolu le problème!!
    Voila les GROSSES modifications que j'ai apporté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g_signal_connect(G_OBJECT(pEBox), "button_press_event", G_CALLBACK(ChargementImage), &paramEBox);
     
    	gtk_widget_set_events (pEBox, GDK_BUTTON_PRESS_MASK);
    Et là nikel, ca réagit exactement comme je voulais!
    Je m'en vais donc manger le coeur léger...

    Bonne journée! et encore merci

+ 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