Kurs GTK+ – rozdział 4

1

4. Zdarzenia

4.1. Zamknięcie okna

Zauważyłeś zapewne, że po zamknięciu okna, proces programu dalej działał. Dzieje się tak, ponieważ nie dodaliśmy przechwytywania zdarzeń. To będzie właśnie tematem tego rozdziału kursu.

Za dodawanie akcji, które będą wykonywane w przypadku jakiegoś zdarzenia, służy:

gulong g_signal_connect(gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data)

Pierwszym argumentem jest instancja, do której ma zostać podłączone nasze zdarzenie, następnym jest nazwa sygnału, kolejnym wykonywana funkcja i ostatnim – argumenty dla niej. Powyższą funkcję będziemy wywoływać przed gtk_widget_show_all().

Nazwą sygnału dla zamknięcia okna jest „destroy”. Za zakończenie działania głównej pętli GTK+ odpowiedzialna jest funkcja gtk_main_quit(). Tak więc aby po zamknięciu okna programu został zakończony jego proces, należy dopisać następującą linijkę:

g_signal_connect(G_OBJECT(okno), "destroy", G_CALLBACK(gtk_main_quit), NULL);

Od tej pory zamykając okno programu, zostanie zakończony również proces.

4.2. Przesuwanie okna

Z wiedzą zdobytą w poprzednich rozdziałach możemy rozbudować nasz program, by po przesunięciu okna wyświetlał aktualną pozycję względem lewego górnego rogu pulpitu. Stwórzmy sobie więc następującą funkcję:

void wyswietl_polozenie(GtkWindow *okno, GdkEvent *zdarzenie, gpointer dane)
{
   int x, y;
   char polozenie[10];

   x = zdarzenie->configure.x;
   y = zdarzenie->configure.y;
   sprintf(polozenie, "%d, %d", x, y);

   gtk_window_set_title(okno, polozenie);
}

Na początku definiujemy 3 zmienne: x i y, które nam będą przechowywały położenie okna, oraz polozenie, która nam to przechowa już w postaci tekstu.

W zdarzenie->configure znajdziemy położenie okna. Przypisujemy je do zmiennych x i y. Następnie za pomocą funkcji sprintf() zamieniamy liczby na tekst, a na końcu ustawiamy nowy tytuł okna.

Pozostało nam jeszcze dodać nowe zdarzenie do okna programu. Wykorzystamy oczywiście znaną nam już funkcję g_signal_connect(). Wykorzystamy zdarzenie configure-event. Argumenty do naszej funkcji zostaną automatycznie przesłane. Tak więc nad wywołaniem funckji gtk_widget_show_all() dopisujemy:

g_signal_connect(G_OBJECT(okno), "configure-event", G_CALLBACK(wyswietl_polozenie), NULL);

Nasz program wygląda teraz tak:

W następnym rozdziale omówię kontenery.

Jeden komentarz

  1. Filip

    bardzo przydatny kurs, nie wiem gdzie miałbym szukać pomocy gdyby nie to 🙂

    Odpowiedz

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>