Kurs GTK+ – rozdział 3

4

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

  1. 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.

    Odpowiedz
    • m4tx

      admin

      Złe kodowanie ustawiłeś i dlatego się ten error pojawia. A pozostałe błędy naprawię w najbliższej przyszłości 🙂

      Odpowiedz
  2. 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?

    Odpowiedz
  3. 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 ?

    Odpowiedz

Zostaw komentarz do m4tx

Kliknij tutaj, aby anulować odpowiadanie.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>