Ten post został opublikowany 13 lat temu. Informacje mogą być przestarzałe, poglądy autora mogły ewoluować lub post może być nieaktualny w jakiś inny sposób. Weź to pod uwagę podczas czytania tego posta.
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>intmain(intargc,char*argv[]){
GtkWidget *okno;
GtkWidget *etykieta1;
GtkWidget *etykieta2;
GtkWidget *etykieta3;
GtkWidget *hseparator;
GtkWidget *vseparator;
GtkWidget *vbox;
GtkWidget *hbox;constchar 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();return0;}
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ą:
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.
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:
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>intmain(intargc,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();return0;}
Efekt działania powyższego kodu jest następujący:
Następny rozdział kursu opisze, jak utworzyć menu i pasek narzędziowy.