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 :

[GTK+ 3.12] Taille viewport


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut [GTK+ 3.12] Taille viewport
    Bonjour,

    Je définis un ViewPort contenant plusieurs widgets dans un GtkGrid.

    Le ViewPort n'est pas dans une GtkScrolledWindow mais est contrôlé en défilement par ailleurs.

    Mon problème est qu'il refuse de se laisser réduire lorsque je veux réduire la fenêtre principale et qu'il prend systématiquement comme taille mini la taille imposée par les widgets contenus.

    Donc, comment lui dire de se comporter de la même manière qu'il se comporte lorsqu'il est contenu dans une GtkScrolledWindow, parce que là, ça marche ?

    Dit autrement, ne pas propager des requètes de ses fils et accepter les ordres de dimensionnement de son parent.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

  2. #2
    Membre régulier Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Manuel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Points : 93
    Points
    93
    Par défaut
    Hello,

    As tu essayé avec size_request ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_set_size_request(grid, min_width, min_height);

    @+
    f(x) = y

  3. #3
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    Oui, bien sur.

    Mais comme le viewport demande plus d'espace, la directive est sans effet.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

  4. #4
    Membre régulier Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Manuel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Points : 93
    Points
    93
    Par défaut
    Autant pour moi, il faut faire un set_size_request sur le viewport et non sur son contenue.

    Code c : 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
    #include <gtk/gtk.h>// gtk+-2.0
    int
    main (int argc, char *argv[])
    {
      GtkWidget *window;
      GtkWidget *button1, *button2, *button3, *button4;
      GtkWidget *hscrollbar, *vscrollbar;
      GtkWidget *hbox, *vbox;
      GtkWidget *viewport;
      GtkAdjustment *hadjustment, *vadjustment;
     
      gtk_init (&argc, &argv);
     
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
     
     
      button1 = gtk_button_new_with_label ("Hello World 1");
      button2 = gtk_button_new_with_label ("Hello World 2");
      button3 = gtk_button_new_with_label ("Hello World 3");
      button4 = gtk_button_new_with_label ("Hello World 4");
     
      hbox = gtk_hbox_new(TRUE, 1);
      vbox = gtk_vbox_new(FALSE, 1);
     
      viewport = gtk_viewport_new(NULL, NULL);
     
      gtk_container_add(GTK_CONTAINER(hbox), GTK_WIDGET(button1));
      gtk_container_add(GTK_CONTAINER(hbox), GTK_WIDGET(button2));
      gtk_container_add(GTK_CONTAINER(hbox), GTK_WIDGET(button3));
      gtk_container_add(GTK_CONTAINER(hbox), GTK_WIDGET(button4));
     
      gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(hbox));
     
      hadjustment = gtk_viewport_get_hadjustment(viewport);
      hscrollbar = gtk_hscrollbar_new(hadjustment);
     
      gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(viewport));
      gtk_container_add(GTK_CONTAINER(vbox), GTK_WIDGET(hscrollbar));
     
      gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(vbox));
     
      //gtk_widget_set_size_request(GTK_WIDGET(hbox), 50, 50);
      gtk_widget_set_size_request(GTK_WIDGET(viewport), 200, 50);
     
     
      gtk_widget_show_all (window);
     
      g_signal_connect(G_OBJECT(window), "destroy",
                        G_CALLBACK(gtk_main_quit), NULL);
     
     
      gtk_main ();
     
      return 0;
    }

    Je m'appeçoit seulement après que tu es sur gtk+3; normalement c'est pareil hors mis les gtk_hbox_new() qui deviennent des gtk_box_new(HORIZONTAL)
    f(x) = y

  5. #5
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Merci Shaublore, je vais essayer ça et je vous dit quoi.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

  6. #6
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Marche pô mieux.

    Je vous livre le code :

    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    int main (int argc, char *argv[])
     
    {
     
      unsigned int i, j;
     
    /* GTK initialisation */
     
      gtk_init (&argc, &argv);
     
    /* Widgets déclaration */
     
      GtkWindow *window;
      GtkScrolledWindow *scrolledwindow;
      GtkAdjustment *horizontal, *vertical;
      GtkViewport *viewport;
      GtkGrid *grid1, *grid2, *grid;
      GtkButton *buttons1[10][10], *buttons2[10][10];
     
    /* Widgets création */
     
      window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL));
     
    /* Create a scrolled window and a viewport, each with one grid of buttons. */
     
      scrolledwindow = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
      horizontal = gtk_scrolled_window_get_hadjustment (scrolledwindow);
      vertical = gtk_scrolled_window_get_vadjustment (scrolledwindow);
     
    /* Use the adjustments of the scrolled window to synchronize both containers. */
     
      viewport = GTK_VIEWPORT (gtk_viewport_new (horizontal, vertical));
     
      grid1 = GTK_GRID (gtk_grid_new ());
      grid2 = GTK_GRID (gtk_grid_new ());
      grid = GTK_GRID (gtk_grid_new ());
     
      for (i = 0; i < 10; i++)
     
      {
     
        for (j = 0; j < 10; j++)
     
        {
     
          buttons1[i][j] = GTK_BUTTON (gtk_button_new_with_label ("Close"));
          buttons2[i][j] = GTK_BUTTON (gtk_button_new_with_label ("Close"));
     
        }
     
      }
     
    /* Widgets configuration */
     
      gtk_window_set_title (window, "Scrolled Windows & Viewports");
      gtk_container_set_border_width (GTK_CONTAINER (window), 10);
      gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
     
      gtk_container_set_border_width (GTK_CONTAINER (scrolledwindow), 5);
      gtk_scrolled_window_set_policy (scrolledwindow, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);  
     
      gtk_container_set_border_width (GTK_CONTAINER (viewport), 5);
     
      gtk_grid_set_row_homogeneous (grid1, FALSE);
      gtk_grid_set_column_homogeneous (grid1, FALSE);
      gtk_grid_set_row_spacing (grid1, 5);
      gtk_grid_set_column_spacing (grid1, 5);
     
      gtk_grid_set_row_homogeneous (grid2, FALSE);
      gtk_grid_set_column_homogeneous (grid2, FALSE);
      gtk_grid_set_row_spacing (grid2, 5);
      gtk_grid_set_column_spacing (grid2, 5);
     
      gtk_grid_set_row_spacing (grid, 5);
      gtk_grid_set_row_homogeneous (grid, TRUE);
      gtk_grid_set_column_homogeneous (grid, TRUE);
     
      for (i = 0; i < 10; i++)
     
      {
     
        for (j = 0; j < 10; j++)
     
        {
     
          gtk_button_set_image (buttons1[i][j], gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_BUTTON));
          gtk_button_set_always_show_image (buttons1[i][j], TRUE);
          gtk_button_set_relief (buttons1[i][j], GTK_RELIEF_NONE);
     
          gtk_button_set_image (buttons2[i][j], gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_BUTTON));
          gtk_button_set_always_show_image (buttons2[i][j], TRUE);
          gtk_button_set_relief (buttons2[i][j], GTK_RELIEF_NONE);
     
        }
     
      }
     
    /* Widgets attachment */
     
    /* Pack each grid with 100 buttons. */
     
      for (i = 0; i < 10; i++)
     
      {
     
        for (j = 0; j < 10; j++)
     
        {
     
          gtk_grid_attach (grid1, GTK_WIDGET (buttons1[i][j]), i, j, 1, 1);
          gtk_grid_attach (grid2, GTK_WIDGET (buttons2[i][j]), i, j, 1, 1);
     
        }
     
      }
     
      gtk_container_add (GTK_CONTAINER (viewport), GTK_WIDGET (grid1));
     
      gtk_container_add (GTK_CONTAINER (scrolledwindow), GTK_WIDGET (grid2));
     
     
    /* Pack the widgets into a Grid and then into the window. */
     
      gtk_grid_attach (grid, GTK_WIDGET (viewport), 0, 0, 1, 1);
      gtk_grid_attach_next_to (grid, GTK_WIDGET (scrolledwindow), GTK_WIDGET (viewport), GTK_POS_BOTTOM, 1 ,1);
     
      gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (grid));
     
    /* Signals attachment */
     
      g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
      gtk_widget_show_all (GTK_WIDGET (window));
     
      gtk_main();
     
      return EXIT_SUCCESS;
     
    }
    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

  7. #7
    Membre régulier Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Manuel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Points : 93
    Points
    93
    Par défaut
    Si vous trouvez une solution sachez que je suis interesé.

    (Peut etre faut-il implementer un ScrolledWindow, puisque j'imagine que ton but est de positionner arbitrairement les scrollbars)

    @+
    f(x) = y

  8. #8
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Si je déclare deux scrollwindows (chacune comprenant un viewport), ça fonctionne parfaitement. Je peux redimensionner ma fenêtre principale comme je veux.

    Cela veut dire qu'il y a une interaction entre la scrollwindow et le viewport qui est à l'intérieur qui fait que ce dernier ne propage pas les requètes d'espace d'affichage de ses enfants, ce qui ne se fait pas si le viewport est déclaré seul.

    Par contre, ça marche avec la bibliothèque GTK+ 2.

    J'ai récupéré les sources de GTK+ 3.12 et j'ai regardé les codes de GtkScrolledWindow et GtkViewport, mais je n'ai encore pas trouvé.

    Je vous tiens au courant dès que j'ai quelque chose.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

  9. #9
    Membre régulier Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Manuel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    On en parle aussi ici.

    J'ai moi aussi regardé le code source: https://git.gnome.org/browse/gtk+/tr...w.c?h=gtk-3-12
    Il me semble que ces deux lignes ne sont pas sans rapport.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gtk_scrolled_window_relative_allocation() {
        // ...
        allocation->width = MAX (1, allocation->width - (sb_width + sb_spacing));
        // ...
        allocation->height = MAX (1, allocation->height - (sb_height + sb_spacing));
    }


    Pourquoi veux tu utiliser un Viewport sans ScrolledWindow ?
    f(x) = y

  10. #10
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Bonjour,

    De retour.

    Je suis en train d'apprendre GTK+ avec le bouquin d'Andrew Krause : "Fondations of GTK+ Development". Par contre, il est basé sur GTK+ 2.

    J'ai donc entrepris de transposer ses exemples en GTK+ 3.

    Celui qui me résiste actuellement est le 7.1. Il s'agit de deux viewports, l'un dans une scrolledwindow et l'autre seul, les deux étant contrôlés de manière synchronisée par les scrollbars de la scrolledwindow. Ça marche en GTK+ 2 mais pas en GTK+ 3.

    Cela pourrait représenter de manière extrêmement rudimentaire la fenêtre d'un éditeur séparée en deux et dont le défilement des deux parties est contrôlé par une seule scrollbar.

    Je vais regarder ce que tu m'as envoyé.

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

Discussions similaires

  1. Aide pour gtk fenetres et tailles
    Par moncef363 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 07/06/2013, 10h45
  2. GTK+ image d'arrière plan et taille de fenêtre
    Par Ekarisor dans le forum Windows
    Réponses: 1
    Dernier message: 24/11/2007, 16h01
  3. Taille Widgets en GTK
    Par Ange44 dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 04/08/2006, 14h51
  4. Donner une taille fixe à un widget GTK
    Par gwenhael dans le forum GTK+
    Réponses: 3
    Dernier message: 26/06/2006, 15h59
  5. taille du texte dans un viewport
    Par pitounette dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/07/2002, 13h06

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