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 :

Double clic...


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Par défaut Double clic...
    J'ai trouvé dans la FAQ le code pour implémenter l'événement double-clic sur un bouton, mais ma fonction (copiée directement depuis le site et à peine changée) ne marche pas elle ne détecte pas de double clic

    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
    gboolean
    on_clic                                (GObject       *widget,
                                            GdkEventButton  *event,
                                            gpointer         user_data)
    {
     
     
     if (GTK_IS_BUTTON(widget) &&
           (event->type==GDK_2BUTTON_PRESS ||
            event->type==GDK_3BUTTON_PRESS) ) {
               lbl = lookup_widget(window1, "label1");
               gtk_label_set_label(GTK_LABEL(lbl), "Double clic");
      }
     
      return FALSE;
    Avez vous déjà utilisé le double clic? Avez vous des éléments de réponse?

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: [GTK] Double clic...
    Citation Envoyé par @drien
    J'ai trouvé dans la FAQ le code pour implémenter l'événement double-clic sur un bouton, mais ma fonction (copiée directement depuis le site et à peine changée) ne marche pas elle ne détecte pas de double clic
    Je ne connais pas grand chose à GTK+, mais il n'y a pas un évènement "double-click" qu'on pourrait installer avec g_signal_connect() ?

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    En fait les deux seuls reels evenements d'un widget pour les click sont les signaux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    "button-press-event"
                gboolean    user_function      (GtkWidget      *widget,
                                                GdkEventButton *event,
                                                gpointer        user_data)
    "button-release-event"
                gboolean    user_function      (GtkWidget      *widget,
                                                GdkEventButton *event,
                                                gpointer        user_data)
    L'evenement "clicked" d'un GtkButton etant sans aucun doute la combinaison des deux ! Maintenant pour le double click, ce qu'il est possible de faire en magouillant un ptit peu:

    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
     
    gboolean
    on_clic                                (GObject       *widget,
                                            GdkEventButton  *event,
                                            gpointer         user_data)
    {
     static int dclick = 0
     
     
     if (GTK_IS_BUTTON(widget) &&
           (event->type==GDK_2BUTTON_PRESS ||
            event->type==GDK_3BUTTON_PRESS) ) {
               if (dclick)
               {
                  lbl = lookup_widget(window1, "label1");
                  gtk_label_set_label(GTK_LABEL(lbl), "Double clic");
                  dclick = 0;
               }
               else
               {
                  dclick = 1;
               }
      }
     
      return FALSE;
    En ajoutant un ptit timer de 2 sec par exemple .... enfin c'est une solution, je l'ai jamais mis en pratique deja en generale un double click sur un Bouton de commande ca se fait pas trop
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Par défaut
    En fait d'après mes tests la condition event->tyoe == GDK_2BUTTON_PRESS ne marche pas... sinon pour le timer, il faudrait que ej vérifie que le deuxième clic est arrivé avant un certain temps c'est ça?

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par @drien
    sinon pour le timer, il faudrait que ej vérifie que le deuxième clic est arrivé avant un certain temps c'est ça?
    Oui c'est ca !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je vais faire des tests avec GDK parceque normalement il n'y a pas de raisons que ca ne fonctionne pas, j'ai d'ailleur vu la description des constantes:

    GDK_BUTTON_PRESS a mouse button has been pressed.
    GDK_2BUTTON_PRESS a mouse button has been double-clicked (clicked twice within a short period of time). Note that each click also generates a GDK_BUTTON_PRESS event.
    GDK_3BUTTON_PRESS a mouse button has been clicked 3 times in a short period of time. Note that each click also generates a GDK_BUTTON_PRESS event.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bon bin chez moi ca fonctionne pas trop mal j'dois dire, j'ai utilisé un bouton avec l'evenement "button-press-event" ... et avec un double clique ... voici le code complet:

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
     
     
    GtkWidget * p_window;
    GtkWidget * p_vbox;
    GtkWidget * p_button;
     
     
    static gboolean cb_double_click (GtkWidget * p_widget,
                                     GdkEventButton * p_event,
                                     gpointer p_data)
    {
       if (GTK_IS_BUTTON (p_widget) && p_event->type == GDK_2BUTTON_PRESS)
       {
          gtk_button_set_label (GTK_BUTTON (p_button), "Double clicked !");
          printf ("Double clicked !\n");
       }
       else
       {
          gtk_button_set_label (GTK_BUTTON (p_button), "Normal...");
          printf ("Normal...\n");
       }
     
     
       return FALSE;
    }
     
     
    int main (int argc, char **argv)
    {
       /* Initialisation de GTK. */
       gtk_init (&argc, &argv);
     
     
       /* Creation de la fenetre principale du programme. */
       p_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     
       /* Attributs de bases de la fenetre principale. */
       gtk_window_set_title (GTK_WINDOW (p_window), "...");
       gtk_window_set_default_size (GTK_WINDOW (p_window), 200, 200);
       gtk_window_set_position (GTK_WINDOW (p_window), GTK_WIN_POS_CENTER);
       gtk_container_set_border_width (GTK_CONTAINER (p_window), 5);
     
     
       /* Connexion de l'evenement de destruction de la fenetre. */
       g_signal_connect (
          G_OBJECT (p_window),
          "destroy",
          G_CALLBACK (gtk_main_quit),
          NULL);
     
       /* Mise en place du container de base. */
       p_vbox = gtk_hbox_new (FALSE, 0);
       gtk_container_add (GTK_CONTAINER (p_window), p_vbox);
     
     
       /* Creation et ajout du bouton. */
       p_button = gtk_button_new_with_label ("Normal...");
       gtk_box_pack_start (GTK_BOX (p_vbox), p_button, TRUE, TRUE, 1);
     
       g_signal_connect (
          G_OBJECT (p_button),
          "button-press-event",
          G_CALLBACK (cb_double_click),
          NULL);
     
       /* Affichage des widgets. */
       gtk_widget_show_all (p_window);
     
     
       /* Boucle GTK. */
       gtk_main ();
     
     
       return EXIT_SUCCESS;
    }
    Il est à noter que j'ai aussi essayé avec le signal "button-release-event" avec lequel ca n'a pas fonctionné !
    En espérant avoir pû t'aider
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Par défaut
    Ouep merci en fait c'est bien mon événement qui marchait pas : button_release_envent ou button-release-event ça marche pas, j'ai juste changé mon événement en button_press_event et c'est bon!


    Merci en tout cas

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par @drien
    Ouep merci en fait c'est bien mon événement qui marchait pas : button_release_envent ou button-release-event ça marche pas, j'ai juste changé mon événement en button_press_event et c'est bon!
    press : appui
    release : laché

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par CSoldier
    Bon bin chez moi ca fonctionne pas trop mal j'dois dire, j'ai utilisé un bouton avec l'evenement "button-press-event" ... et avec un double clique ... voici le code complet:
    Pas très joli ces globales... (Testé avec Code::Blocks, impec !)
    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    #include <gtk/gtk.h>
     
    static gboolean cb_double_click (GtkWidget * p_widget,
                                     GdkEventButton * p_event,
                                     gpointer p_data)
    {
       if (p_widget != NULL)
       {
          if (GTK_IS_BUTTON (p_widget) && p_event->type == GDK_2BUTTON_PRESS)
          {
     
             gtk_button_set_label (GTK_BUTTON (p_widget), "Double clicked !");
             printf ("Double clicked !\n");
          }
          else
          {
             gtk_button_set_label (GTK_BUTTON (p_widget), "Normal...");
             printf ("Normal...\n");
          }
       }
     
       return FALSE;
    }
     
    int main (int argc, char **argv)
    {
       /* Initialisation de GTK. */
       gtk_init (&argc, &argv);
     
       /* Creation de la fenetre principale du programme. */
       GtkWidget * p_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     
       if (p_window != NULL)
       {
          /* Attributs de bases de la fenetre principale. */
          gtk_window_set_title (GTK_WINDOW (p_window), "...");
          gtk_window_set_default_size (GTK_WINDOW (p_window), 200, 200);
          gtk_window_set_position (GTK_WINDOW (p_window), GTK_WIN_POS_CENTER);
          gtk_container_set_border_width (GTK_CONTAINER (p_window), 5);
     
     
          /* Connexion de l'evenement de destruction de la fenetre. */
          g_signal_connect (
             G_OBJECT (p_window),
             "destroy",
             G_CALLBACK (gtk_main_quit),
             NULL);
     
          /* Mise en place du container de base. */
          GtkWidget * p_vbox = gtk_hbox_new (FALSE, 0);
     
          if (p_vbox != NULL)
          {
             gtk_container_add (GTK_CONTAINER (p_window), p_vbox);
     
     
             /* Creation et ajout du bouton. */
             GtkWidget * p_button = gtk_button_new_with_label ("Normal...");
     
             if (p_button != NULL)
             {
                gtk_box_pack_start (GTK_BOX (p_vbox), p_button, TRUE, TRUE, 1);
     
                g_signal_connect (
                   G_OBJECT (p_button),
                   "button-press-event",
                   G_CALLBACK (cb_double_click),
                   p_button);
     
                /* Affichage des widgets. */
                gtk_widget_show_all (p_window);
     
     
                /* Boucle GTK. */
                gtk_main ();
             }
          }
       }
       return EXIT_SUCCESS;
    }

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pas très joli ces globales...
    Certes .... ma bon, c'etait uniquement a titre d'exemple, du vite fait quoi .. en générale j'évite aussi les globales
    D'ailleurs, inutile de passer le GtkButton dans l'argument p_data de type gpointer car il est deja passé au permier argument de type GtkWidget
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par CSoldier
    Citation Envoyé par Emmanuel Delahaye
    Pas très joli ces globales...
    Certes .... ma bon, c'etait uniquement a titre d'exemple, du vite fait quoi .. en générale j'évite aussi les globales
    D'ailleurs, inutile de passer le GtkButton dans l'argument p_data de type gpointer car il est deja passé au permier argument de type GtkWidget
    Oups, effectivement ! Je corrige.

    [EDIT] Par contre, le label n'est pas modifié. C'est normal ? Il manque pas un genre de 'redraw()'... ?

  13. #13
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par CSoldier
    Citation Envoyé par Emmanuel Delahaye
    Pas très joli ces globales...
    Certes .... ma bon, c'etait uniquement a titre d'exemple, du vite fait quoi .. en générale j'évite aussi les globales
    D'ailleurs, inutile de passer le GtkButton dans l'argument p_data de type gpointer car il est deja passé au permier argument de type GtkWidget
    Oups, effectivement ! Je corrige.

    [EDIT] Par contre, le label n'est pas modifié. C'est normal ? Il manque pas un genre de 'redraw()'... ?
    Ha chez moi le titre sur le bouton est modifié ! Il faut juste que le double click soit assez rapide sinon il prend ca comme un click simple ... en fait il doit surement se baser sur les reglages systeme ou du WindowManager dans le cas de Linux comme chez moi !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  14. #14
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Le plus simple pour les paramètres des callback c'est de mettre les composants dans une structure qu'on passera par adresse. C'est la méthode fénéant

    Nas'

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par CSoldier
    [EDIT] Par contre, le label n'est pas modifié. C'est normal ? Il manque pas un genre de 'redraw()'... ?
    Ha chez moi le titre sur le bouton est modifié ! Il faut juste que le double click soit assez rapide sinon il prend ca comme un click simple ... en fait il doit surement se baser sur les reglages systeme ou du WindowManager dans le cas de Linux comme chez moi !
    J'ai bien la trace dans la console (Windows XP) ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Normal...
    Normal...
    Double clicked !
    Normal...
    Normal...
    Normal...
    Double clicked !
    Normal...
    Normal...
    Double clicked !
    Normal...
     
    Press ENTER to continue.
    Mais je n'arrive jamais à avoir le message "Double clicked !" tout seul. Il est toujours suivi de "Normal...", ce qui explique que je ne vois pas le changement de label...

  16. #16
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Humm oui effectivement, je pense que celà depend surtout de la plateforme (enfin pour le comportement) parce que chez moi, voici ma console:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Normal...
    Double clicked !
    Normal...
    Normal...
    Double clicked !
    Normal...
    Normal...
    Double clicked !
    Normal...
    Normal...
    Double clicked !
    csoldier@csubuntu:~/Sauvegardes/Programmation/TEST$
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. comment autoriser le double clic sur un champ desactivé ?
    Par linou dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/04/2005, 17h23
  2. [VB.NET] Ouvrir fichier dans appli par double-clic dessus
    Par vynce dans le forum Windows Forms
    Réponses: 4
    Dernier message: 29/03/2005, 16h43
  3. ListBox, Cases à cocher et Double-Clic
    Par Loïc dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/02/2005, 10h18
  4. Ouvrir un fichier sur un double-clic dans une TListBox
    Par SegmentationFault dans le forum Composants VCL
    Réponses: 4
    Dernier message: 09/08/2004, 17h22
  5. [débutant] Listview et double-clic
    Par Runlevel dans le forum C++Builder
    Réponses: 12
    Dernier message: 29/06/2004, 19h44

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