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 :

affichage étrange quand on double-clique sur la barre de titre ou qu'on réduit puis restaure


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut affichage étrange quand on double-clique sur la barre de titre ou qu'on réduit puis restaure
    Bonjour/bonsoir,

    Je suis en train de coder un programme en C avec Gtk+ sous Windows, mais je rencontre un bug que je ne parviens pas à cerner : quand je réduit ma fenêtre et que je la restaure, ou quand je double-clique sur la barre de titre, la mise en page ce modifie (avec certains éléments qui sortent de l'écran!!!). le fait de double-cliquer à nouveau sur la barre de titre rétablis l'apparence.

    Néanmoins, même si j'ai fini par découvrir comment remettre l'apparence correctement, je souhaiterais éliminer ce problème : j'ai donc essayé d'enlevé tout ce qui n'influait pas de mon code, mais même ainsi je ne suis pas parvenus à trouver l'erreur.

    Si quelqu'un aurait l'amabilité de regarder le code (réduit), je lui en serait infiniment reconnaissant :
    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <glib/gstdio.h>
    void OnDestroy(GtkWidget *pWidget, gpointer pData);
     
     
    gint i;
    GtkWidget *pFrame=NULL;
    GtkWidget *pNotebook=NULL;
    GtkWidget *pSpin=NULL;
    GtkWidget *pTable=NULL;
    GtkWidget *pTable_CalculDesPlaces=NULL;
    GtkWidget *pTable_DetailEtablissement=NULL;
    GtkWidget *pWindow=NULL;
    GtkWidget *pBouton_CalculerLesPlaces;
     
    int main(int argc,char **argv)
    {
        gtk_init(&argc,&argv);
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(OnDestroy), NULL);
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 600, 600);
     
        pTable=gtk_table_new(3000,3000,TRUE);
        gtk_container_add(GTK_CONTAINER(pWindow), GTK_WIDGET(pTable));
     
     
     
        // Creation du GtkNotebook //
        pNotebook = gtk_notebook_new();
        gtk_table_attach_defaults(GTK_TABLE(pTable), pNotebook, 210, 550, 60, 550 );
     
     
     
     
        for(i = 0 ; i < 2 ; i++)
        {
            GtkWidget *pTabLabel;
            gchar *sTabLabel;
     
     
            switch (i)
            {
                case 0:
                    pTable_DetailEtablissement = gtk_table_new(490, 340, TRUE);
                    sTabLabel = g_strdup_printf("Detail Etablissement");
     
     
                    pFrame = gtk_frame_new("Lundi");
                    pSpin = gtk_spin_button_new_with_range(0, 1000, 1);
                    gtk_container_add(GTK_CONTAINER(pFrame), pSpin);
                    gtk_table_attach(GTK_TABLE(pTable_DetailEtablissement), pFrame, 0,100,60,100, GTK_EXPAND|GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
     
     
                    pFrame = gtk_frame_new("Mardi");
                    pSpin = gtk_spin_button_new_with_range(0, 1000, 1);
                    gtk_container_add(GTK_CONTAINER(pFrame), pSpin);
                    gtk_table_attach(GTK_TABLE(pTable_DetailEtablissement), pFrame, 0,100,110,150, GTK_EXPAND|GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
     
     
                    pFrame = gtk_frame_new("Mercredi");
                    pSpin = gtk_spin_button_new_with_range(0, 1000, 1);
                    gtk_container_add(GTK_CONTAINER(pFrame), pSpin);
                    gtk_table_attach(GTK_TABLE(pTable_DetailEtablissement), pFrame, 0,100,160,200, GTK_EXPAND|GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
     
     
                    pFrame = gtk_frame_new("Jeudi");
                    pSpin = gtk_spin_button_new_with_range(0, 1000, 1);
                    gtk_container_add(GTK_CONTAINER(pFrame), pSpin);
                    gtk_table_attach(GTK_TABLE(pTable_DetailEtablissement), pFrame, 0,100,210,250, GTK_EXPAND|GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
     
     
                    pFrame = gtk_frame_new("Vendredi");
                    pSpin = gtk_spin_button_new_with_range(0, 1000, 1);
                    gtk_container_add(GTK_CONTAINER(pFrame), pSpin);
                    gtk_table_attach(GTK_TABLE(pTable_DetailEtablissement), pFrame, 0,100,260,300, GTK_EXPAND|GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
     
     
     
                    pTabLabel = gtk_label_new(sTabLabel);
                    gtk_notebook_append_page(GTK_NOTEBOOK(pNotebook), GTK_WIDGET(pTable_DetailEtablissement), pTabLabel);
                    g_free(sTabLabel);
     
     
                    break;
                case 1:
                    pTable_CalculDesPlaces = gtk_table_new(490, 340, TRUE);
     
                    pBouton_CalculerLesPlaces = gtk_button_new_with_label("calculer l'atribution des places");
                    gtk_table_attach(GTK_TABLE(pTable_CalculDesPlaces),pBouton_CalculerLesPlaces, 0,100,30,60, GTK_EXPAND|GTK_SHRINK|GTK_FILL,GTK_EXPAND|GTK_SHRINK|GTK_FILL,0,0);
     
     
     
                    sTabLabel = g_strdup_printf("Calculer l'atribution des places");
                    pTabLabel = gtk_label_new(sTabLabel);
                    gtk_notebook_append_page(GTK_NOTEBOOK(pNotebook), GTK_WIDGET(pTable_CalculDesPlaces), pTabLabel);
                    break;
            }
        }
     
     
        gtk_widget_show_all(pWindow);
        gtk_main();
        return EXIT_SUCCESS;
    }
     
    void OnDestroy(GtkWidget *pWidget, gpointer pData)
    {
        gtk_main_quit();
    }
    Merci d'avance
    Kartorps

  2. #2
    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
    Bravo pour avoir mis mon netbook à genoux...
    Tu te rends bien compte que gtk_table_new indique le nombre de cases que tu veux, pas leur taille ? Tu crées des conteneurs gigantesques (300 x 300 cellules, 490 x 340), en leur disant de garder des tailles identiques pour les contenus... Et en plus tu y mets de GtkNotebook, qui ont une taille énorme. Tu m'étonnes que ça sort de l'écran. Je te conseille donc de lire en profondeur la doc de GtkTable (qui n'existe d'ailleurs plus en GTK3, pour info). Fais des exemples de base d'utilisation de tes widgets, parce que là, on dirait que tu as codé en pensant "je code tout d'abord, je testerai à la fin".

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup, le problème venait effectivement du fait que les gtk_tables étaient trop grosses (j'avais pensé les mettre grosses au début pour être très précis quand au placement de mes widgets, mal m'en a pris.

    Par contre, par curiosité, qu'entend tu par "Bravo pour avoir mis mon netbook à genoux..."?

    Merci beaucoup
    Katorps

  4. #4
    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
    La GtkTable s'apprêtait à recevoir en tout 423200 widgets dans les dents... Tu as peut être une machine puissante, mais moi sur mon netbook c'est assez simple, le système s'est verrouillé, j'ai dû tuer les processus à l'arrache sachant que la machine ne répondait quasiment plus... J'ai fait les tests suivants en gardant un terminal virtuel pré-ouvert pour pouvoir tuer ton programme...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Désolé.
    et merci pour l'information, pour moi une gtk-table était juste une espèce de repère qui permet de choisir les coordonnées d'un widget. je ne pensais pas au fait que ce n'est pas définit comme un repère en maths (origine et vecteurs directeurs (ici coin en haut à gauche et taille horizontale et verticale d'une "case)) mais comme un tableau dont chaque case contient (ou pas) un widget ou un bout de widget.

    Merci beaucoup
    Katorps

  6. #6
    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
    Citation Envoyé par katorps Voir le message
    pour moi une gtk-table était juste une espèce de repère qui permet de choisir les coordonnées d'un widget. je ne pensais pas au fait que ce n'est pas définit comme un repère en maths (origine et vecteurs directeurs (ici coin en haut à gauche et taille horizontale et verticale d'une "case)) mais comme un tableau dont chaque case contient (ou pas) un widget ou un bout de widget.
    Katorps
    Bin c'est la première ligne de la doc de GtkTable...

    The GtkTable functions allow the programmer to arrange widgets in rows and columns, making it easy to align many widgets next to each other, horizontally and vertically.
    C'est également indiqué dans la doc de gtk_table_attach_defaults:

    left_attach :
    The column number to attach the left side of the child widget to.

    right_attach :
    The column number to attach the right side of the child widget to.

    top_attach :
    The row number to attach the top of the child widget to.

    bottom_attach :
    The row number to attach the bottom of the child widget to.
    Conclusion: toujours lire la doc d'un composant avant de l'utiliser, ou faire un petit programme test minimal pour s'assurer qu'on a compris le fonctionnement... De même, on trouve des tutoriels qui permettent de comprendre par l'exemple le fonctionnement d'un widget...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    merci beaucoup, je n'avais en effet pas lu la doc en entier (vu mon niveau en anglais, pour comprendre le fonctionnement d'un widget, je préfère me référer à des tutos en français), je n'ai que regarder les fonctions quand j'en cherchais une qui n'était pas dans le tuto.

    Et dans le tuto que j'avais regardé, ils n'insistaient pas sur le fait qu'il s'agissait en fait d'un tableau contenant autant de cases que le produit lignes* colonnes, mais commençait en parlant de grille invisible, j'avais pensé que le widget stockait juste une liste des widgets attachés avec leurs emplacement (et la définition d'un "repère"), et pas toutes les cases vides.

    merci beaucoup
    katorps

Discussions similaires

  1. Affichage de l'icone du site sur la barre de titre
    Par OurysBack dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 13/01/2012, 18h39
  2. Message d'erreur quand je double clique sur ma clé usb
    Par nourouissiakou dans le forum Windows XP
    Réponses: 6
    Dernier message: 25/11/2009, 18h57
  3. Evenement double clique sur jTable
    Par oOoOuuhmAn dans le forum Composants
    Réponses: 20
    Dernier message: 08/03/2006, 12h05
  4. [VB]Double clique sur liste...
    Par STRUFIELD dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/01/2006, 13h43

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