Conteneurs mono-éléments
Les éléments conteneurs mono-éléments dérivent de la classe Gtk::Bin ; cette classe comporte les fonctions membres add() et remove() pour les éléments graphiques enfants. Notez que les objets de la classe Gtk::Button et Gtk::Window sont techniquement des conteneurs mono-éléments ; nous l'avons déjà signalé par ailleurs.
Nous évoquerons également l'élément graphique Gtk::Paned qui vous permet de partager une fenêtre en deux « volets » séparés. Cet élément graphique comporte en réalité deux éléments graphiques enfants, mais comme ce nombre est fixe, son classement dans les mono-éléments paraît approprié.
- VIII.I.I. Cadre
- VIII.I.II. Volets
- VIII.I.III. Fenêtre à défilement
- VIII.I.IV. Cadre proportionné
- VIII.I.V. Alignement
VIII.I.I. Cadre
Les cadres, avec un intitulé en option, peuvent entourer un ou un groupe d'éléments graphiques dans une boîte. Par exemple, vous pouvez placer un groupe de RadioButton ou de CheckButton dans un objet Frame.
- VIII.I.I.I. Exemple
VIII.I.I.I. Exemple
File: examplewindow.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLEWINDOW_H #define GTKMM_EXAMPLEWINDOW_H #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public: ExampleWindow(); virtual ~ExampleWindow(); protected: //Child widgets: Gtk::Frame m_Frame; }; #endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" ExampleWindow::ExampleWindow() { /* Set some window properties */ set_title("Frame Example"); set_size_request(300, 300); /* Sets the border width of the window. */ set_border_width(10); add(m_Frame); /* Set the frames label */ m_Frame.set_label("Gtk::Frame Widget"); /* Align the label at the right of the frame */ //m_Frame.set_label_align(Gtk::ALIGN_END, Gtk::ALIGN_START); /* Set the style of the frame */ m_Frame.set_shadow_type(Gtk::SHADOW_ETCHED_OUT); show_all_children(); } ExampleWindow::~ExampleWindow() { }
File: main.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); ExampleWindow window; //Shows the window and returns when it is closed. return app->run(window); }
VIII.I.II. Volets
Panes divide a widget into two halves, separated by a moveable divider. The two halves (panes) can be oriented either horizontally (side by side) or vertically (one above the other).
Unlike the other widgets in this section, pane widgets contain not one but two child widgets, one in each pane. Therefore, you should use add1() and add2() instead of the add() method.
Il est possible d'ajuster la position de la division avec la fonction membre set_position() ; vous aurez certainement besoin de le faire.
- VIII.I.II.I. Exemple
VIII.I.II.I. Exemple
File: messageslist.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLE_MESSAGESLIST_H #define GTKMM_EXAMPLE_MESSAGESLIST_H #include <gtkmm.h> class MessagesList: public Gtk::ScrolledWindow { public: MessagesList(); virtual ~MessagesList(); class ModelColumns : public Gtk::TreeModel::ColumnRecord { public: ModelColumns() { add(m_col_text); } Gtk::TreeModelColumn<Glib::ustring> m_col_text; }; ModelColumns m_Columns; protected: Glib::RefPtr<Gtk::ListStore> m_refListStore; //The Tree Model. Gtk::TreeView m_TreeView; //The Tree View. }; #endif //GTKMM_EXAMPLE_MESSAGESLIST_H
File: messagetext.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLE_MESSAGETEXT_H #define GTKMM_EXAMPLE_MESSAGETEXT_H #include <gtkmm.h> class MessageText : public Gtk::ScrolledWindow { public: MessageText(); virtual ~MessageText(); void insert_text(); protected: Gtk::TextView m_TextView; }; #endif //GTKMM_EXAMPLE_MESSAGETEXT_H
File: examplewindow.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLEWINDOW_H #define GTKMM_EXAMPLEWINDOW_H #include "messageslist.h" #include "messagetext.h" #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public: ExampleWindow(); virtual ~ExampleWindow(); protected: //Child widgets: Gtk::Paned m_VPaned; MessagesList m_MessagesList; MessageText m_MessageText; }; #endif //GTKMM_EXAMPLEWINDOW_H
File: messagetext.cc (For use with gtkmm 3, not gtkmm 2)
#include "messagetext.h" MessageText::MessageText() { set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); add(m_TextView); insert_text(); show_all_children(); } MessageText::~MessageText() { } void MessageText::insert_text() { Glib::RefPtr<Gtk::TextBuffer> refTextBuffer = m_TextView.get_buffer(); Gtk::TextBuffer::iterator iter = refTextBuffer->get_iter_at_offset(0); refTextBuffer->insert(iter, "From: [email protected]\n" "To: [email protected]\n" "Subject: Made it!\n" "\n" "We just got in this morning. The weather has been\n" "great - clear but cold, and there are lots of fun sights.\n" "Sojourner says hi. See you soon.\n" " -Path\n"); }
File: messageslist.cc (For use with gtkmm 3, not gtkmm 2)
#include "messageslist.h" #include <sstream> MessagesList::MessagesList() { /* Create a new scrolled window, with scrollbars only if needed */ set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); add(m_TreeView); /* create list store */ m_refListStore = Gtk::ListStore::create(m_Columns); m_TreeView.set_model(m_refListStore); /* Add some messages to the window */ for(int i = 0; i < 10; ++i) { std::ostringstream text; text << "message #" << i; Gtk::TreeModel::Row row = *(m_refListStore->append()); row[m_Columns.m_col_text] = text.str(); } //Add the Model's column to the View's columns: m_TreeView.append_column("Messages", m_Columns.m_col_text); show_all_children(); } MessagesList::~MessagesList() { }
File: examplewindow.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" ExampleWindow::ExampleWindow() : m_VPaned(Gtk::ORIENTATION_VERTICAL) { set_title ("Paned Windows"); set_border_width(10); set_default_size(450, 400); /* Add a vpaned widget to our toplevel window */ add(m_VPaned); /* Now add the contents of the two halves of the window */ m_VPaned.add1(m_MessagesList); m_VPaned.add2(m_MessageText); show_all_children(); } ExampleWindow::~ExampleWindow() { }
File: main.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); ExampleWindow window; //Shows the window and returns when it is closed. return app->run(window); }
VIII.I.III. Fenêtre à défilement
Les éléments graphiques ScrolledWindow créent une zone qu'il est possible de faire défiler. Vous pouvez insérer n'importe quel type d'élément graphique dans une fenêtre de la classe ScrolledWindow ; cet élément graphique restera totalement accessible quelle que soit sa taille grâce aux barres de défilement. Notez que la classe ScrolledWindow ne dérive pas de la classe Gtk::Window, même si les dénominations peuvent prêter à confusion.
La fenêtre déroulante définit une politique de barres de défilement pour indiquer comment son objet Scrollbar doit être affiché. Cette politique est définie à l'aide de la fonction membre set_policy(). Le paramètre policy prend l'une des deux valeurs suivantes : Gtk::POLICY_AUTOMATIC ou bien Gtk::POLICY_ALWAYS. Gtk::POLICY_AUTOMATIC déclenche l'affichage de la barre de défilement uniquement si l'élément graphique incorporé est plus grand que la zone visible. Avec Gtk::POLICY_ALWAYS, les barres de défilement sont toujours affichées.
- VIII.I.III.I. Exemple
VIII.I.III.I. Exemple
Voici un exemple simple qui place 100 boutons bascules dans une fenêtre à défilement. Essayez de redimensionner la fenêtre pour voir comment les barres de défilement réagissent.
File: examplewindow.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLEWINDOW_H #define GTKMM_EXAMPLEWINDOW_H #include <gtkmm.h> class ExampleWindow : public Gtk::Dialog { public: ExampleWindow(); virtual ~ExampleWindow(); protected: //Signal handlers: void on_button_close(); //Child widgets: Gtk::ScrolledWindow m_ScrolledWindow; Gtk::Grid m_Grid; Gtk::Button m_Button_Close; }; #endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <cstdio> ExampleWindow::ExampleWindow() : m_Button_Close("Close") { set_title("Gtk::ScrolledWindow example"); set_border_width(0); set_size_request(300, 300); m_ScrolledWindow.set_border_width(10); /* the policy is one of Gtk::POLICY AUTOMATIC, or Gtk::POLICY_ALWAYS. * Gtk::POLICY_AUTOMATIC will automatically decide whether you need * scrollbars, whereas Gtk::POLICY_ALWAYS will always leave the scrollbars * there. The first one is the horizontal scrollbar, the second, * the vertical. */ m_ScrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_ALWAYS); get_content_area()->pack_start(m_ScrolledWindow); /* set the spacing to 10 on x and 10 on y */ m_Grid.set_row_spacing(10); m_Grid.set_column_spacing(10); /* pack the grid into the scrolled window */ m_ScrolledWindow.add(m_Grid); /* this simply creates a grid of toggle buttons * to demonstrate the scrolled window. */ for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { char buffer[32]; sprintf(buffer, "button (%d,%d)\n", i, j); Gtk::Button* pButton = Gtk::manage(new Gtk::ToggleButton(buffer)); m_Grid.attach(*pButton, i, j, 1, 1); } } /* Add a "close" button to the bottom of the dialog */ m_Button_Close.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_close)); /* this makes it so the button is the default. */ m_Button_Close.set_can_default(); Gtk::Box* pBox = get_action_area(); if(pBox) pBox->pack_start(m_Button_Close); /* This grabs this button to be the default button. Simply hitting * the "Enter" key will cause this button to activate. */ m_Button_Close.grab_default(); show_all_children(); } ExampleWindow::~ExampleWindow() { } void ExampleWindow::on_button_close() { hide(); }
File: main.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); ExampleWindow window; //Shows the window and returns when it is closed. return app->run(window); }
VIII.I.IV. Cadre proportionné
L'élément graphique de la classe AspectFrame est semblable à l'élément graphique Frame, mais, en plus, il impose à l'élément graphique enfant de garder un rapport de proportion (rapport de la largeur à la hauteur) constant ; il laisse un espace libre si nécessaire. Par exemple, vous pourrez afficher une photographie sans que l'utilisateur puisse la déformer horizontalement ou verticalement lorsqu'il la redimensionne.
- VIII.I.IV.I. Exemple
VIII.I.IV.I. Exemple
Le programme suivant utilise un objet Gtk::AspectFrame pour afficher une surface de tracé dont les proportions sont toujours égales à 2:1 quelles que soient les dimensions données à la fenêtre principale par l'utilisateur.
File: examplewindow.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLEWINDOW_H #define GTKMM_EXAMPLEWINDOW_H #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public: ExampleWindow(); virtual ~ExampleWindow(); protected: //Child widgets: Gtk::AspectFrame m_AspectFrame; Gtk::DrawingArea m_DrawingArea; }; #endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" ExampleWindow::ExampleWindow() : m_AspectFrame("2x1", /* label */ Gtk::ALIGN_CENTER, /* center x */ Gtk::ALIGN_CENTER, /* center y */ 2.0, /* xsize/ysize = 2 */ false /* ignore child's aspect */) { set_title("Aspect Frame"); set_border_width(10); // Add a child widget to the aspect frame */ // Ask for a 200x200 window, but the AspectFrame will give us a 200x100 // window since we are forcing a 2x1 aspect ratio */ m_DrawingArea.set_size_request(200, 200); m_AspectFrame.add(m_DrawingArea); // Add the aspect frame to our toplevel window: add(m_AspectFrame); show_all_children(); } ExampleWindow::~ExampleWindow() { }
File: main.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); ExampleWindow window; //Shows the window and returns when it is closed. return app->run(window); }
VIII.I.V. Alignement
L'élément conteneur Alignment vous permet de placer dans une fenêtre un élément graphique dont la taille et la position sont mesurés en rapport de celle du conteneur Alignment lui-même. Par exemple, vous pourrez l'utiliser pour centrer un contrôle.
Il est nécessaire de préciser les caractéristiques de l'objet Alignment dans son constructeur, ou bien à l'aide de la fonction membre set(). En particulier, vous ne noterez aucun effet si vous ne définissez pas un nombre différent de 1.0 pour les paramètres xscale et yscale ; en effet, 1.0 signifie simplement que l'élément graphique enfant doit prendre tout l'espace disponible.
- VIII.I.V.I. Exemple
VIII.I.V.I. Exemple
Cet exemple aligne à droite un bouton dans une fenêtre à l'aide de l'élément conteneur Alignment.
File: examplewindow.h (For use with gtkmm 3, not gtkmm 2)
#ifndef GTKMM_EXAMPLEWINDOW_H #define GTKMM_EXAMPLEWINDOW_H #include <gtkmm.h> class ExampleWindow : public Gtk::Window { public: ExampleWindow(); virtual ~ExampleWindow(); protected: //Signal handlers: void on_button_clicked(); //Child widgets: Gtk::Alignment m_Alignment; Gtk::Button m_Button; }; #endif //GTKMM_EXAMPLEWINDOW_H
File: examplewindow.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" ExampleWindow::ExampleWindow() : m_Alignment(Gtk::ALIGN_END, Gtk::ALIGN_CENTER, 0.0, 0.0), m_Button("Close") { set_title("Gtk::Alignement"); set_border_width(10); set_default_size(200, 50); add(m_Alignment); m_Alignment.add(m_Button); m_Button.signal_clicked().connect( sigc::mem_fun(*this, &ExampleWindow::on_button_clicked) ); show_all_children(); } ExampleWindow::~ExampleWindow() { } void ExampleWindow::on_button_clicked() { hide(); }
File: main.cc (For use with gtkmm 3, not gtkmm 2)
#include "examplewindow.h" #include <gtkmm/application.h> int main(int argc, char *argv[]) { Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example"); ExampleWindow window; //Shows the window and returns when it is closed. return app->run(window); }
Dans le paragraphe sur les Barres de progression, vous pourrez voir un autre exemple d'utilisation de la classe Alignment.