Kurs GTK+ – rozdział 7

0

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.

Zostaw komentarz

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>