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 :

Modifier un GtkLabel au passage de la souris.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut Modifier un GtkLabel au passage de la souris.
    Bonsoir,

    À chaque jour suffit ça peine...

    J'ai encore un problème avec GTK. ( gtk 3.6, sous Windows10 )

    Je souhaite, lorsque la souris passe sur un "label" modifier ce dernier.

    Exemple: changer sa couleur, ou le souligner, ou l'agrandir... etc.

    Et là encore, je patauge lamentablement.

    Merci de bien vouloir venir à mon secours.

    J'ai déjà réussi, grâce à vous , à changer la forme du pointeur de la souris.

    Je pensais que ça allait être aussi facile... et bien non!
    J'ai vraiment du mal avec Gtk.... ... NULL, NULL, NULL.


    Merci à vous.

    Bonne soirée et bon Weekend.

    Claude.

  2. #2
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    Bonjour,


    Je me permets de revenir sur le sujet, espérant pouvoir trouver une bonne âme pour m'aider.

    J'ai pu glaner sur le net quelques exemples, malheureusement pour la plupart "très ancien" et "presque toujours en anglais.

    Ce qui n'est pas mon langage préféré... d'où certainement des erreurs de compréhension ou d'interprétation.

    Et bien sûr, aucun ne fonctionne, sans que bien évidement je ne sache pourquoi... sinon je ne serais pas là à vous em***

    Je vous explique:

    Dans main.h:

    J'ai créé une structure (s_variables) dans laquelle j'ai mis mes widgets.

    Dans main.c:
    J'ai créé ma variable de structure. (s_variables maVar);

    J'ai initialisé la fenêtre principale, puis passé l'adresse de maVar à une fonction. ( ma_Fonction(&maVar, maVar) );

    Que j'ai réceptionné de cette façon. ( ma_Fonction(s_variables *pVar, s_variables maVar) )

    Puis j'ai utilisé sans problème, mes box, mes labels, mes frames ... etc. ( pVar->mesWidget)

    Mes problèmes apparaissent lorsque j'essaye d'utiliser la fonction G_CALLBACK...

    Si le dernier paramètre est NULL, pas de problème, ça fonctionne correctement.

    Les problèmes surgissent, dès que j'essaie de faire passer les paramètres de la structure.

    Voilà comment je procède:

    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
     
     
    g_signal_connect(G_OBJECT(pVar->pLabel1), "enter-notify-event",
                            G_CALLBACK(Modif_label), &maVar);
     
     
    //Fonction pour le changement du Label et du curseur de souris.
    extern void Modif_label(GtkWidget *pLabel1, gpointer pData)
    {
    //Récupération de pData.
        s_variables *p = pData;
     
    //Changement curseur.
        GdkCursor *pCursor = NULL;
        pCursor = gdk_cursor_new(GDK_HAND2);
        GdkWindow *pGdk_Window = NULL;
        pGdk_Window = gtk_widget_get_window(GTK_WIDGET(p->pWindow));
        gdk_window_set_cursor(pGdk_Window, pCursor);
     
    //Modification du texte.
       gtk_label_set_text(GTK_LABEL(p->pLabel1), "zzz");
     
    //Paramètre non utilisé.
       (void) pLabel1;
    }
    Pas de plantage à la compilation, ma fenêtre apparaît correctement, mais les changements demandés ne sont pas présent.

    J'espère avoir été assez explicite dans mon exposé et que vous pourrez intervenir pour me signifier où j'ai fauté.
    Mais SVP ... ...


    Avec mes remerciements anticipés pour toute l'aide que vous saurez m'apporter.

    Bonne journée.

    Claude.

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour,

    GtkLabel est un widget un peu particulier, je crois qu'il n'a pas de GdkWindow associée et du coup ne peut pas recevoir d'événements. Tu dois mettre ton GtkLabel dans une GtkEventBox et te connecter aux signaux de la GtkEventBox.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #4
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    Merci d'avoir répondu à ma requête.

    J'ai déjà mis mon GtkLabel dans une "event-box" pour qu'il puisse recevoir le clic de ma souris.

    Et ça fonctionne.

    Ça fonctionne d'autant plus que le code suivant donne le résultat escompté:

    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
     
    g_signal_connect(G_OBJECT(pLabel1_event_box), "enter-notify-event",
                         G_CALLBACK(Curseur_Main), NULL);
     
     
    extern void Curseur_Main(GtkWidget *pWindow, gpointer pData)
    {
        GdkCursor *pCursor = NULL;
        pCursor = gdk_cursor_new(GDK_HAND2);
        GdkWindow *pGdk_Window = NULL;
        pGdk_Window = gtk_widget_get_window(GTK_WIDGET(pWindow));
        gdk_window_set_cursor(pGdk_Window, pCursor);
     
     
        g_object_unref(pCursor);
     
     
    //Paramètre non utilisé.
       (void) pData;
    }

    Et si dans mes fonctions, je remplace "pVar->pLabel1" par "pLabel1_event_box" (l'event_box qui donc contient le label), là, c'est tout le système plante. (Une petite fenêtre Windows annonce que le programme est planté et qu'il va le fermer.)

    C'est pour cela qu'il me semble, que le problème viendrait plutôt du passage des paramètres...

    Mais, je ne suis pas sûr du tout...

    À suivre...

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Le problème que tu rencontres est un classique du genre. Tu ne respectes pas le prototype de la fonction CallBack.

    Pour le signal "enter-notify-event" le prototype est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gboolean
    user_function (GtkWidget *widget,
                   GdkEvent  *event,
                   gpointer   user_data)
    Et toi tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern void Modif_label(GtkWidget *pLabel1, gpointer pData)
    Naturellement tu ne récupères pas le bon pointeur dans ton callback. Et à partir de là les ennuis commencent

  6. #6
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    Merci pour ton intervention.

    J'ai déjà rencontré cette information, mais ça n'avait rien donné.

    Je viens donc de changer mes fonctions afin de tenir compte de ce que tu me dis de faire.

    Mais, je dois certainement faire quelque chose de travers, car le résultat est identique.

    C'est à dire: Rien.

    Voilà ce que j'ai fait.

    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
     
     
    //La fonction de départ.
    g_signal_connect(G_OBJECT(pVar->pLabel1), "enter-notify-event",
                         G_CALLBACK(Modif_label), &maVar);
     
     
    //La fonction d'arrivé.
    gboolean Modif_label(GtkWidget *pLabel1, GdkEvent *event, gpointer pData)
    {
    //Récupération de pData.
        s_variables *p = pData;
     
    //Modification du pointeur.
        GdkCursor *pCursor = NULL;
        pCursor = gdk_cursor_new(GDK_HAND2);
        GdkWindow *pGdk_Window = NULL;
        pGdk_Window = gtk_widget_get_window(GTK_WIDGET(p->pWindow));
        gdk_window_set_cursor(pGdk_Window, pCursor);
     
     
    //Modification du texte.
        gtk_label_set_text(GTK_LABEL(p->pLabel1), "zzz");
     
    //Paramètres non utilisés.
       (void) pLabel1;
       (void) event;
     
     
     
        return FALSE;
    }
    La compilation m'annonce que 'pLabel1' et 'event' ne sont pas utilisés.

    Pour éviter ce message, j'ai rajouté:
    //Paramètres non utilisés.... mais c'est certainement pas heureux.

    Merci pour ton aide, comme tu peux voir, je débute avec Gtk et je galère.

    Claude

  7. #7
    Membre averti
    Avatar de Claude URBAN
    Homme Profil pro
    Prendre le temps de vivre. . .
    Inscrit en
    Mai 2006
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Prendre le temps de vivre. . .

    Informations forums :
    Inscription : Mai 2006
    Messages : 274
    Points : 327
    Points
    327
    Par défaut
    Bonjour,





    Ça y est: ENFIN.

    Grand merci à liberforce et gerald3d qui, sans le savoir, m'ont donné les bons éléments de réflexion.

    Premièrement: RESPECTER IMPÉRATIVEMENT LES "PROTOTYPES DE FONCTION". ( Voir ci-dessus l'exemple de gerald3d. )

    Deuxièmement: J'ai revu le principe de base de fonctionnement des pointeurs.

    Et oui, pas simple, mais très efficace.


    Et pour ceux que ça intéresse:

    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
     
     
    //Les fonctions d'appel.
       g_signal_connect(G_OBJECT(pLabel1_event_box), "enter-notify-event",
                         G_CALLBACK(Curseur_Main), pVar);
     
     
        g_signal_connect(G_OBJECT(pLabel1_event_box), "leave-notify-event",
                         G_CALLBACK(Curseur_Arrow), pVar);
     
     
     
     
    /* pVar (pointeur sur s_variables) contient l'adresse de la variable de ma structure. (s_variables maVar;) 
    Et c'est CETTE adresse qu'il faut passer en paramètres.*/
     
     
    /* pLabel1_event_box, est la boîte d'évènement (GtkEventBox) qui contient mon label: pLabel1. */
     
     
    //Les fonctions réceptrices.
     
    //Fonction pour le changement du Label et du pointeur. (MAIN)
    gboolean Curseur_Main(GtkWidget *pLabel1_event_box, GdkEvent *event, gpointer pData)
    {
     //Récupération de pData.
        s_variables *p = pData;
     
    //Modification du pointeur.
        GdkCursor *pCursor = NULL;
        pCursor = gdk_cursor_new(GDK_HAND2);
        GdkWindow *pGdk_Window = NULL;
        pGdk_Window = gtk_widget_get_window(GTK_WIDGET(p->pWindow));
        gdk_window_set_cursor(pGdk_Window, pCursor);
     
    //Modification du texte.
        gtk_label_set_text(GTK_LABEL(p->pLabel1), "zzz");
     
    //Paramètres non utilisés.
       (void) pLabel1_event_box;
       (void) event;
     
        return FALSE;
    /*Return TRUE, pour que plus aucun évènement n'est d'effet sur le widget tant que la souris est placée dessus et FALSE, pour le contraire.*/
    }
     
     
    //Fonction pour la remise en état du Label d'origine et du pointeur. (FLÈCHE)
    gboolean Curseur_Arrow(GtkWidget *pLabel1_event_box, GdkEvent *event, gpointer pData)
    {
    //Récupération de pData.
        s_variables *p = pData;
     
    //Modification du pointeur.
        GdkCursor *pCursor = NULL;
        pCursor = gdk_cursor_new(GDK_ARROW);
        GdkWindow *pGdk_Window = NULL;
        pGdk_Window = gtk_widget_get_window(GTK_WIDGET(p->pWindow));
        gdk_window_set_cursor(pGdk_Window, pCursor);
     
        g_object_unref(pCursor);
     
    //Modification du texte.
        gtk_label_set_text(GTK_LABEL(p->pLabel1), "Ici Texte cliquable.");
     
    //Paramètres non utilisés.
       (void) pLabel1_event_box;
       (void) event;
     
        return FALSE;
    }

    Voilà.

    Une fois que l'on a trouvé, l'on se dit: " Merde, c'était pourtant vachement facile et tellement évident..."

    Mais bon!

    En espérant ne pas avoir laissé traîner quelques erreurs dans mon code, il ne me reste plus qu'à vous souhaiter une bonne journée et à cocher ENFIN...


    Bonne journée.

    Claude.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/07/2011, 06h31
  2. [XL-2010] Modifier couleur ligne au passage de la souris
    Par chochois dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/08/2010, 14h14
  3. Modifier image selon passage de la souris
    Par beral dans le forum C++Builder
    Réponses: 4
    Dernier message: 03/10/2006, 17h49
  4. changer couleur du lien au passage de la sourie
    Par toome dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 01/08/2005, 10h11

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