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 :

Perte de focus apres fin de barre de progression


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut Perte de focus apres fin de barre de progression
    Bonjour a tous,

    je debute en GTK+ (WinXP SP3 / MS Visual C++ 2008 express edition) et suis confronte a un petit souci.

    J'ai cree une fenetre principale, une table qui contient un bouton et une barre de progression.

    Quand je clique sur le bouton, la fonction callback appellee fait progresser la barre (20 iterations avec un Sleep de 500 ms). Pendant que la barre de progression evolue, je bloque les actions de l'utilisateur (gtk_grab_add) et lui rend la main a la fin (gtk_grab_remove). ca marche bien sauf que :

    Si l'utilisateur clique, attend la fin du scenario barre de progression, et ne bouge pas la souris, le fait de recliquer sur le bouton est sans effet, sauf s'il ballade la souris et la replace sur le bouton.

    Y a t'il un moyen de resoudre ce souci (controler un mouvement de souris hors du bouton et la remettre a sa place sans que l'utilisateur le voit, ...).

    J'ai fait un code allege qui montre bien le probleme :

    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 <windows.h>
    // Specific librairies
    #include <gtk/gtk.h>
     
    void OnDestroy(GtkWidget *pWidget, gpointer pData);
    void OnTop(GtkWidget *pWidget, gpointer pData);
     
    static GtkWidget *pProgressBar;
     
    int main(int argc,char **argv)
    {
     
    	// Declare widgets
    	GtkWidget *pWindow;
    	GtkWidget *pTable;
    	GtkWidget *pTopBtn;
     
    	gtk_init(&argc,&argv);
     
    	// Create the main window
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
    	gtk_window_set_title(GTK_WINDOW(pWindow), "Control Panel");
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
     
    	// Create table : 2 rows / 4 columns
    	pTable=gtk_table_new(2,4,TRUE);
    	gtk_container_add(GTK_CONTAINER(pWindow), GTK_WIDGET(pTable));
     
    	// Create TOP Button
    	pTopBtn = gtk_button_new_with_label("Click on me");
    	g_signal_connect(G_OBJECT(pTopBtn), "clicked", G_CALLBACK(OnTop),NULL);
     
    	// Create progress bar
     
    	pProgressBar = gtk_progress_bar_new();
    	gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(pProgressBar),
    	GTK_PROGRESS_LEFT_TO_RIGHT);
     
    	// Insert the widgets in the table
    	gtk_table_attach_defaults(GTK_TABLE(pTable), pTopBtn,
    	1, 3, 0, 1);
    	gtk_table_attach(GTK_TABLE(pTable), pProgressBar,
    	0, 4, 1, 2,
    	GTK_EXPAND | GTK_FILL, GTK_EXPAND,
    	0, 0);
     
    	// Display main window
    	gtk_widget_show_all(pWindow);
     
    	// Start events loop
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }
     
    void OnDestroy(GtkWidget *pWidget, gpointer pData)
    {	
    	gtk_main_quit();
    }
     
     
    void OnTop(GtkWidget *pWidget, gpointer pData)
    {
    	gdouble dFraction;	
    	gint i, iTotal;
    	iTotal = 10;
    	// Use grab to prevent the user to press any button 
    	gtk_grab_add(pProgressBar);
    	for(i = 1 ; i <= iTotal ; ++i)
    	{
    		Sleep(500);
    		dFraction = (gdouble)i / (gdouble)iTotal;		
    		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pProgressBar), dFraction);
    		// GTK+ becomes active to refresh the progress bar
    		gtk_main_iteration ();
    	}
    	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pProgressBar), 0.0);	
    	// Give the hand to the user
    	gtk_grab_remove(pProgressBar);
    }
    Merci d'avance.

    LePapat

    PS : j'en profite, si vous avez des conseils. Je voudrais definir toutes mes fonctions callback dans un autre fichier callback.c et inserer un callback.h dans mon fichier main. Mais je suis bloque sur le fait que j'appelle la progressbar depuis un callback appelle par un autre widget. L'ideal serait de la passer en argument mais je ne me suis pas encore documente sur le sujet

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut
    Hello,

    j'ai toujours mon probleme du focus sur bouton.

    mais pour le PS j'avais ete un peu faineant, j'ai trouve la solution decrite sur ce forum (definir une structure contenant les widgets et passer cette structure en argument des callback).




    Lepapat.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut
    No idea ?
    J'ai ecume les forums mais pas de solutions pour le moment.

    Lepapat

  4. #4
    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
    C'est (c'était ?) un bug dans gtk+ si mes souvenirs sont bons, j'ai pas réussi à le retrouver dans le bugzilla par contre pour savoir s'il était corrigé ou non :-/

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut
    OK. Merci pour cette reponse.
    J'utilise la version 2.10 de GTK+ car j'ai trouve un super tuto sur ce site qui fournit un executable qui installe tout ce qu'il faut ou il faut.

    peut etre cette version contient ce bug.

    Mon autre idee etait de faire apparaitre une nouvelle fenetre contenant la barre de progression. la fenetre se ferme a la fin de la progression mais je n'ai pas reussi a la faire fonctionner. Impossible de voir la barre de progression.

    Je vais peut etre retravailler sur cette idee si ce bug est trop penalisant.

    A+

    Lepapat

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Par défaut
    Hello,

    j'ai finalement trouve le truc pour eviter ce probleme.
    Utiliser le signal
    "pressed" : void user_function(GtkButton *button, gpointer user_data);
    Ce signal est émis au moment où l'on appuie sur le bouton.
    au lieu de "clicked".

    Ce qui permet de cliquer plusieurs fois sur le bouton sans bouger la souris.

    Lepapat

  7. #7
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Bah voila, tout simplement
    Bien vu dudu

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

Discussions similaires

  1. perte du focus aprés un onblur
    Par makroute dans le forum JSF
    Réponses: 1
    Dernier message: 24/06/2011, 14h18
  2. datagrid case a cocher validation apres perte de focus
    Par Julien666 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/01/2008, 21h03
  3. Réponses: 4
    Dernier message: 05/10/2006, 13h10
  4. Réponses: 8
    Dernier message: 26/09/2006, 09h19
  5. Réponses: 9
    Dernier message: 02/02/2006, 15h46

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