3. Widżety
3.1. Wstawienie przycisku
W tym rozdziale dowiesz się, jak wstawić przycisk do naszego pustego okna.Aby jednak to zrobić, potrzebujemy kontenera, w którym będziemy mogli go umieścić. Użyjemy kontenera, który się nazywa fixed. Jego główną cechą jest to, że widżety umieszcza się w nim, podając położenie oraz rozmiar w pikselach. Poniżej znajduje się kod źródłowy z drugiego rozdziału:
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *okno; gtk_init (&argc, &argv); okno = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (okno); gtk_main (); return 0; }
Po:
GtkWidget *okno;
umieścimy definicje zmiennych, które przechowają nam kontener oraz przycisk. Tak więc dopisujemy pod spodem:
GtkWidget *kontener; GtkWidget *przycisk;
No – ale jak widać, są to tylko wskaźniki, więc nasz kontener i przycisk przydało by się jakoś utworzyć. W tym celu pod linijką
okno = gtk_window_new (GTK_WINDOW_TOPLEVEL);
dopisz:
kontener = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(okno), kontener); przycisk = gtk_button_new_with_label("Twój pierwszy przycisk"); gtk_widget_set_size_request(przycisk, 180, 35); gtk_fixed_put(GTK_FIXED(kontener), przycisk, 10, 10);
Już wszystko tłumaczę:
Pierwsza linijka odpowiada za utworzenie kontenera fixed. Następna umieszcza go w oknie programu. Trzecia tworzy nowy przycisk z etykietą „Twój pierwszy przycisk”. Następna ustala rozmiar przycisku (80×35 pikseli) i ostatnia umieszcza go w kontenerze 50 pikseli od lewej krawędzi kontenera i 20 od górnej.
Żeby ujrzeć nasz przycisk, należy jeszcze zamienić linijkę
gtk_widget_show (okno);
na:
gtk_widget_show_all(okno);
Aby wyświetlić wszystkie widżety, a nie tylko okno programu.
Całość wygląda następująco:
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *okno; GtkWidget *kontener; GtkWidget *przycisk; gtk_init (&argc, &argv); okno = gtk_window_new (GTK_WINDOW_TOPLEVEL); kontener = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(okno), kontener); przycisk = gtk_button_new_with_label("Twój pierwszy przycisk"); gtk_widget_set_size_request(przycisk, 180, 35); gtk_fixed_put(GTK_FIXED(kontener), przycisk, 10, 10); gtk_widget_show_all(okno); gtk_main (); return 0; }
Po skompilowaniu programu powinieneś ujrzeć coś takiego:
3.2. Właściwości okna programu
Uruchamiając swój program, z pewnością zauważyłeś, że rozmiar okna zmienił się. Z 400x400px zmniejszył się do rozmiarów kontenera. Na szczęście da się to zmienić.
void gtk_window_set_default_size (GtkWindow *window, gint width, gint height);
Powyższa funkcja pozwala zmienić domyślny rozmiar okna. Pierwszym argumentem jest referencja do okna, drugim żądana szerokośc, oraz ostatnim wysokość. Zapewne zauważyłeś, że wysokość i szerokość nie jest zmienną typu int, tylko gint. GTK+ korzysta bowiem z własnych typów zmiennych, aby ułatwić portowanie biblioteki na inne języki programowania niż C i C++. Typami zmiennych w GTK+ nie będziemy się jednak w tym rozdziale zajmować, ponieważ są one identyczne jak znane Ci już typy języka C, jak na przykład int, bool, czy float.
Powyższą funkcję warto więc wstawić do kodu naszego programu. W tym celu pod:
okno = gtk_window_new (GTK_WINDOW_TOPLEVEL);
wstaw:
gtk_window_set_default_size (GTK_WINDOW(okno), 300, 200);
Po skompilowaniu i uruchomieniu programu powinno być już o wiele lepiej. Jak zapewne zauważyłeś, wykonaliśmy konwersję GtkWidget na GtkWindow. Jest to wymagane, ponieważ nasze okno ma typ GtkWidget, a funkcja gtk_window_set_default_size() przyjmuje wskaźnik do okna typu GtkWindow.
Warto również sprawić, aby po uruchomieniu okno znajdowało się pośrodku ekranu. W tym celu, pod funkcją gtk_window_set_default_size() wstaw następującą linijkę:
gtk_window_set_position(GTK_WINDOW(okno), GTK_WIN_POS_CENTER);
Oczywiście nie chcesz, aby Twoje okno miało tytuł „kurs_gtkplus”, „main”, czy podobną. To też się da zmienić. Służy do tego funkcja:
void gtk_window_set_title (GtkWindow *window, const gchar *title);
Jako pierwszy argument przyjmuje ona referencję do okna, a jako drugi – żądany tytuł. Aby więc nasze okno miało tytuł „Nasz program”, pod wywołaniem poprzednio opisywanej funkcji, wstaw:
gtk_window_set_title (GTK_WINDOW(okno), "Nasz program");
Po skompilowaniu i uruchomieniu programu okno naszego programu powinno wyglądać następująco:
To by było na tyle w tym rozdziale. W następnym powiem nieco o zdarzeniach w GTK+.
4 komentarze
mrowqa
Kilka drobnych błędów:
gtk_widget_set_size_request(przycisk, 180, 35);
gtk_fixed_put(GTK_FIXED(kontener), przycisk, 10, 10);
Następna ustala rozmiar przycisku (80×35 pikseli) i ostatnia umieszcza go w kontenerze 50 pikseli od lewej krawędzi kontenera i 20 od górnej.
Uruchamiając swój program, z pewnością zauważyłeś, że rozmiar okna zmienił się. Z 400x400px zmniejszył się do rozmiarów kontenera. Na szczęście da się to zmienić.
U mnie domyślnie jest 200x200px. Z tego co pamiętam (ale pewny nie jestem) to w kursie chyba też pisali o 200x200px.
To już taka drobna uwaga, na którą nie zwróciłeś uwagi:
przycisk = gtk_button_new_with_label("Twój pierwszy przycisk");
Pod WIndowsem (a przynajmniej u mnie) w konsoli pojawia się:
(GTK+ test.exe:5768): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()
I w widżecie zamiast 'ó’ pojawia się prostokąt z 'X’ zamiast tego znaku.
m4tx
adminZłe kodowanie ustawiłeś i dlatego się ten error pojawia. A pozostałe błędy naprawię w najbliższej przyszłości 🙂
Jakub
Mam następujący problem. Nawet mimo skopiowania kodu z przykładu, po kompilacji dostaję tylko czyste okno, takie samo jak w rozdziale 2. Domyśla się ktoś w czym tkwi problem?
Marek
Jeżeli chcę zacząć programować w GTK+ w windows to po zainstalowaniu gtk+bundle_2.22.1 będę miał taką możliwość korzystając z code:blocks uwzględniając opcje dla kompilatora i linkera ?