7. Podstawowe kontrolki – część II
7.1. GtkHSeparator
Kolejny rozdział kursu biblioteki GTK+ – ciąg dalszy o kontrolkach
GtkHSeparator to pozioma linia oddzielająca na przykład 2 grupy kontrolek. Tworzy się ją bardzo prostą funkcją:
GtkWidget* gtk_hseparator_new (void);
Która nie przyjmuje żadnych argumentów. Oprócz GtkHSeparator istnieje również bardzo podobna kontrolka. Jest nią GtkVSeparator, a od GtkHSeparatora różni się tym, że tworzona linia nie jest pozioma, a pionowa. Tworzy się ją – jak nietrudno się domyślić – niemal identyczną funkcją jak powyżej:
GtkWidget* gtk_vseparator_new (void);
Poniższy przykład prezentuje obie kontrolki.
#include <gtk/gtk.h>
int main( int argc, char *argv[])
{
GtkWidget *okno;
GtkWidget *etykieta1;
GtkWidget *etykieta2;
GtkWidget *etykieta3;
GtkWidget *hseparator;
GtkWidget *vseparator;
GtkWidget *vbox;
GtkWidget *hbox;
const char lorem_ipsum[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
Maecenas sit amet magna in mi tincidunt iaculis sit amet quis augue. Curabitur libero est, \
vehicula vel consequat a, cursus sit amet risus. Nulla id eros arcu, sit amet dictum eros. \
Cras mollis, leo et dignissim bibendum, purus sapien interdum enim, ut.";
gtk_init(&argc, &argv);
okno = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(okno), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(okno), "Kurs GTK+");
gtk_window_set_resizable(GTK_WINDOW(okno), FALSE);
gtk_container_set_border_width(GTK_CONTAINER(okno), 20);
etykieta1 = gtk_label_new(lorem_ipsum);
gtk_label_set_line_wrap(GTK_LABEL(etykieta1), TRUE);
etykieta2 = gtk_label_new(lorem_ipsum);
gtk_label_set_line_wrap(GTK_LABEL(etykieta2), TRUE);
etykieta3 = gtk_label_new(lorem_ipsum);
gtk_label_set_line_wrap(GTK_LABEL(etykieta3), TRUE);
vbox = gtk_vbox_new(FALSE, 10);
gtk_container_add(GTK_CONTAINER(okno), vbox);
hbox = gtk_hbox_new(FALSE, 10);
hseparator = gtk_hseparator_new();
vseparator = gtk_vseparator_new();
gtk_box_pack_start(GTK_BOX(hbox), etykieta2, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vseparator, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(hbox), etykieta3, FALSE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(vbox), hbox);
gtk_box_pack_start(GTK_BOX(vbox), hseparator, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), etykieta1, FALSE, TRUE, 0);
g_signal_connect (G_OBJECT(okno), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(okno);
gtk_main();
return 0;
}
Efekt działania powyższego kodu po skompilowaniu i uruchomieniu tak powstałego programu jest następujący:
W powyższym kodzie można znaleźć 2 nowe funkcje: gtk_window_set_resizable() oraz gtk_label_set_line_wrap(). Pierwsza z nich ustawia, czy można zmienić rozmiar okna, czy nie. W pierwszym argumencie przyjmuje referencję do widżetu okna, a w drugim TRUE, jeśli zmiana rozmiaru ma być dozwolona i FALSE w przeciwnym wypadku. Druga funkcja natomiast ustawia łamanie wierszy w widżecie GtkLabel. W pierwszym argumencie przyjmuje wskaźnik do etykiety, a w drugim TRUE, jeśli wiersze mają być zawijane oraz FALSE jeśli nie.
7.2. GtkImage
GtkImage pozwala wyświetlić obrazek z pliku. Nowy widżet typu GtkImage można utworzyć następującą funkcją:
GtkWidget* gtk_image_new_from_file (const gchar *filename);
Przyjmuje ona w argumencie ścieżkę do pliku. Powyższa funkcja potrafi wczytać pliki zapisane w wielu popularnych formatach, jak na przykład PNG, JPEG, czy BMP. Poniższy kod ma za zadanie wczytać plik, a następnie wyświetlić go w oknie programu.
#include <gtk/gtk.h>
int main( int argc, char *argv[])
{
GtkWidget *okno;
GtkWidget *obraz;
gtk_init(&argc, &argv);
okno = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(okno), GTK_WIN_POS_CENTER);
gtk_window_set_title(GTK_WINDOW(okno), "Kurs GTK+");
gtk_window_set_resizable(GTK_WINDOW(okno), FALSE);
obraz = gtk_image_new_from_file("obraz.jpg");
gtk_container_add(GTK_CONTAINER(okno), obraz);
g_signal_connect_swapped(G_OBJECT(okno), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(okno);
gtk_main();
return 0;
}
Po skompilowaniu go i uruchomieniu tak powstałego programu zobaczysz:
7.3. GtkStatusbar
GtkStatusbar to pasek statusu. Widnieje on w wielu programach u dołu okna. Tworzy się go funkcją:
GtkWidget* gtk_statusbar_new (void);
Natomiast tekst w nim ustawia się funkcją:
guint gtk_statusbar_push (GtkStatusbar *statusbar, guint context_id, const gchar *text);
W pierwszym argumencie należy podać wskaźnik do widżetu GtkStatusbar. W drugim identyfikator kontekstu, który można pobrać za pomocą funkcji gtk_statusbar_get_context_id(), która zostanie omówiona za chwilę, oraz żądany tekst do ustawienia. Funkcja zwraca identyfikator wiadomości, który może później zostać użyty do jej usunięcia. Wspomniana funkcja gtk_statusbar_get_context_id() wygląda następująco:
guint gtk_statusbar_get_context_id (GtkStatusbar *statusbar, const gchar *context_description);
Przyjmuje ona w pierwszym argumencie referencję do widżetu paska statusu, oraz w drugim żądaną wiadomość. Należy zwrócić uwagę, że w pasku statusu zostanie ustawiony tekst z funkcji gtk_statusbar_push(), a nie gtk_statusbar_get_context_id().
Poniżej można zobaczyć, jak używać kontrolki GtkStatusbar.
#include <gtk/gtk.h>
int main( int argc, char *argv[])
{
GtkWidget *okno;
GtkWidget *etykieta1;
GtkWidget *statusbar;
GtkWidget *vbox;
gtk_init(&argc, &argv);
okno = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(okno), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(okno), 280, 150);
gtk_window_set_title(GTK_WINDOW(okno), "Kurs GTK+");
vbox = gtk_vbox_new(FALSE, 2);
gtk_container_add(GTK_CONTAINER(okno), vbox);
etykieta1 = gtk_label_new("Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
Maecenas sit amet magna in mi tincidunt iaculis sit amet quis augue. Curabitur libero est, \
vehicula vel consequat a, cursus sit amet risus. Nulla id eros arcu, sit amet dictum eros. \
Cras mollis, leo et dignissim bibendum, purus sapien interdum enim, ut.");
gtk_label_set_line_wrap(GTK_LABEL(etykieta1), TRUE);
gtk_box_pack_start(GTK_BOX(vbox), etykieta1, TRUE, TRUE, 10);
statusbar = gtk_statusbar_new();
gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, TRUE, 1);
gtk_statusbar_push(GTK_STATUSBAR(statusbar), gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "Bezczynny"), "Bezczynny");
g_signal_connect(G_OBJECT(okno), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(okno);
gtk_main();
return 0;
}
Efekt działania powyższego kodu jest następujący:
Następny rozdział kursu opisze, jak utworzyć menu i pasek narzędziowy.


