Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux: ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 130

Автор ДСнис ΠšΠΎΠ»ΠΈΡΠ½ΠΈΡ‡Π΅Π½ΠΊΠΎ

Π’Π°ΠΌ каТСтся, Ρ‡Ρ‚ΠΎ ΠΎΠΊΠ½ΠΎ слишком малСнькоС ΠΈ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹? Для измСнСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠΊΠ½Π° Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

void gtk_window_set_default_size(GtkWindow *window,

 gint width, gint height);

Π­Ρ‚Π° функция устанавливаСт ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΎΠΊΠ½Π° window Ρ€Π°Π²Π½ΠΎΠΉ width, Π° высоту β€” height.

Для измСнСния ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΠΊΠ½Π° Π½Π° экранС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция

void gtk_widget_set_uposition(GtkWidget *widget,

 gint coord_x, gint coord_y);

Π­Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для измСнСния располоТСния любого Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° β€” Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ послСдний Π±Ρ‹Π» ΠΎΠΊΠ½ΠΎΠΌ.

ΠŸΠ΅Ρ€Π²Π°Ρ функция объявлСна Π² Ρ„Π°ΠΉΠ»Π΅ gtk/gtkwindow.h, Π° вторая β€” Π² Ρ„Π°ΠΉΠ»Π΅ gtk/gtkwidget.h:

#include <gtk/gtkwindow.h>

#include <gtk/gtkwidget.h>

...

gtk_window_set_default_size(window1, 200, 300);

gtk_wigdet_set_uposition(window1, 50, 50);

23.3.4. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сигналов

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡƒΠ½ΠΊΡ‚Ρƒ, Π½ΡƒΠΆΠ½ΠΎ Π΅Ρ‰Π΅ Ρ€Π°Π· Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_signal_connect(). Π”Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

♦ GtkObject *object β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ послан сигнал;

♦ const gchar *name β€” имя сигнала, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«destroyΒ»;

♦ GtkSignalFunc func β€” имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ сигнала;

♦ gpointer data β€” Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ.

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ сигнал? Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ пСрСмСстил ΠΌΡ‹ΡˆΡŒ, оконная срСда посылаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ сигнал, ΠΎΠΏΠΎΠ²Π΅Ρ‰Π°ΡŽΡ‰ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ΡˆΡŒ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Π°. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ» ΠΌΡ‹ΡˆΡŒΡŽ, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ сигнал ΠΎΠ± этом Ρ‰Π΅Π»Ρ‡ΠΊΠ΅. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС сигналы ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ½ΠΎ, Π½ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° события.

Ѐункция, которая ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ сигнал, называСтся ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ: функция-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ это Π½Π°Π·Π²Π°Π½ΠΈΠ΅), функция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ callback-функция. Π’Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (ΠΈΡ… пСрСдаст сама GTK):

♦ GtkWidget *widget β€” Π²ΠΈΠ΄ΠΆΠΈΡ‚;

♦ gpointer data β€” Π΄Π°Π½Π½Ρ‹Π΅.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, зависят ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ сигнала. НапримСр, Ссли Π±Ρ‹ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈ Π½Π΅ сигнал Β«destroyΒ», Π° сигнал Β«delete-eventΒ», Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

♦ GtkWidget *widget β€” Π²ΠΈΠ΄ΠΆΠΈΡ‚;

♦ GdkEvent *event β€” событиС;

♦ gpointer data β€” Π΄Π°Π½Π½Ρ‹Π΅.

Π’ΠΎΡ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ сигналы:

♦ button_press_event β€” Π½Π°ΠΆΠ°Ρ‚Π° лСвая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ;

♦ button_release_event β€” лСвая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°;

♦ motion_notify_event β€” Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΌΡ‹ΡˆΠΈ;

♦ delete_event β€” ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

♦ destroy_event β€” ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

♦ key_press_event β€” Π½Π°ΠΆΠ°Ρ‚Π° клавиша ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹;

♦ key_release_event β€” клавиша ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°;

♦ enter_notify_event β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ вошСл Π² ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

♦ leave_notify_event β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π²Ρ‹ΡˆΠ΅Π» Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

♦ focus_in_event β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ стал Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ (ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» фокус);

♦ focus_out_event β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½;

♦ drag_begin_event β€” Π½Π°Ρ‡Π°Π»ΠΎ пСрСмСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

♦ drag_request_event β€” запрос Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

♦ drag_end_event β€” ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°;

♦ drop_enter_event β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½.

НаиболСС часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ события GDK (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅) пСрСчислСны Π½ΠΈΠΆΠ΅:

♦ GDK_NOTHING β€” Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ события;

♦ GDK_DELETE β€” ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅;

♦ GDK_DESTROY β€” ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅;

♦ GDK_MOTION_NOTIFY β€” ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ;

♦ GDK_BUTTON_PRESS β€” Π½Π°ΠΆΠ°Ρ‚Π° любая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΈ;

♦ GDK_1BUTTON_PRESS β€” Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ;

♦ GDK_2BUTTON_PRESS β€” Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ;

♦ GDK_3BUTTON_PRESS β€” Π½Π°ΠΆΠ°Ρ‚Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡ ΠΊΠ½ΠΎΠΏΠΊΠ°;

♦ GDK_BUTTON_RELEASE β€” ΠΊΠ½ΠΎΠΏΠΊΠ° (любая) ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°;

♦ GDK_KEY_PRESS β€” Π½Π°ΠΆΠ°Ρ‚Π° клавиша;

♦ GDK_KEY_RELEASE β€” клавиша ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Π°;

♦ GDK_ENTER_NOTIFY β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°);

♦ GDK_LEAVE_NOTIFY β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π²Ρ‹ΡˆΠ΅Π» Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°;

♦ GDK_FOCUS_CHANGE β€” измСнСния фокуса Π²Π²ΠΎΠ΄Π°;

♦ GDK_OTHER_EVENT β€” Π΄Ρ€ΡƒΠ³ΠΎΠ΅ событиС.

23.3.5. Π’ΠΈΠ΄ΠΆΠΈΡ‚ событий β€” EventBox

Π”Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ связаны с ΠΎΠΊΠ½Π°ΠΌΠΈ. НапримСр, GtkLabel (надпись), GtkTable (ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€-Ρ‚Π°Π±Π»ΠΈΡ†Π°), GtkHBox (Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€), GtkVBox (Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€) ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ с ΠΎΠΊΠ½Π°ΠΌΠΈ Π½Π΅ связаны.

Если Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ сигналы, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚ EventBox, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ сигнал ΠΊ Π½Π΅ связанному с ΠΎΠΊΠ½ΠΎΠΌ Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρƒ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° дСмонстрируСт привязку события button_press_event ΠΊ Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρƒ GtkLabel.

Листинг 23.5. Π’ΠΈΠ΄ΠΆΠΈΡ‚ EventBox

#include <gtk/gtk.h>


int main(int argc, char *argv[]) {

 GtkWidget *window1; // Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ

 GtkWidget *event_box1; // eventbox

 GtkWidget *label; // надпись


 /* Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ GTK */

 gtk_init( &argc, &argv );


 /* Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ "Надпись" */

 window1 = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_window_set_title(GTK_WINDOW(window1), "Надпись");


 /* УстанавливаСм Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΠΊΠ½Π° */

 gtk_signal_connect(GTK_OBJECT(window1), "destroy",

  GTK_SIGNAL_FUNC(gtk_exit), NULL );


 /* устанавливаСм ΡˆΠΈΡ€ΠΈΠ½Ρƒ Ρ€Π°ΠΌΠΊΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° β€” ΠΎΠΊΠ½Π° */

 gtk_container_set_border_width(GTK_CONTAINER(window1), 10);


 /* создаСм event_box */

 event_box1 = gtk_event_box_new();

 /* ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ event_box Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ */

 gtk_container_add(GTK_CONTAINER(window1), event_box1);


 /* ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ event_box */

 gtk_widget_show(event_box1);


 /* создаСм надпись */

 label = gtk_label_new(" -== Click here to exit. ==- ");


 /* ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ надпись Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ event_box */

 gtk_container_add(GTK_CONTAINER(event_box1), label);

 /* ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ */

 gtk_widget_show(label);


 /* устанавливаСм Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ GtkLabel Π½Π° Ρ‰Π΅Π»Ρ‡ΠΎΠΊ */

 /*(ΠΏΡ€ΠΈ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ - Π²Ρ‹Ρ…ΠΎΠ΄) */

 gtk_widget_set_events(event_box1, GDK_BUTTON_PRESS_MASK);

 gtk_signal_connect(GTK_OBJECT(event_box1), "button_press_event",

  GTK_SIGNAL_FUNC(gtk_exit), NULL);

 gtk_widget_realize(event_box1);


 /* измСняСм курсор Π½Π°Π΄ надписью β€” курсор прСвратится Π² Ρ€ΡƒΠΊΡƒ */

 gdk_window_set_cursor(event_box1->window, gdk_cursor_new(GDK_HAND1));


 /* ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ */

 gtk_widget_show(window1);


 gtk_main();

 return 0;

}

ΠžΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈ запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Над надписью ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π²ΠΈΠ΄ Ρ€ΡƒΠΊΠΈ (ΠΊΠ°ΠΊ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ Π½Π°Π΄ ссылкой). ΠŸΡ€ΠΈ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ Π½Π° надписи ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°.

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ надпись Π½Π° русском языкС, Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ locale.h ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

setlocale(LC_ALL, "ru_RU.KOI8-R");

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠΌ. Π­Ρ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π”Πž ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ GTK+.

Рис. 23.2. Надпись

23.4. Π’ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹

23.4.1. Π ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠΌΠ΅Ρ€Ρ‚ΡŒ ΠΈ состояния Π²ΠΈΠ΄ΠΆΠΈΡ‚Π°

ПослС создания Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ рСсурсами ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ Π΅ΠΌΡƒ, выполняСтся автоматичСски. Π’ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΆΠ΅ автоматичСски β€” ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Но ΠΈΠ½ΠΎΠ³Π΄Π° Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

void gtk_widget_destroy(GtkWidget *widget);

Π­Ρ‚Π° функция объявлСна Π² Ρ„Π°ΠΉΠ»Π΅ gtk/gtkwidget.h. ΠŸΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ всС Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠΈΡ‚Ρ‹.

Если Π²Ρ‹ освобоТдаСтС Π²ΠΈΠ΄ΠΆΠΈΡ‚ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ:

void gtk_container_remove(GtkContainer *cont, GtkWidget *w);

Ρ‚ΠΎ Π²ΠΈΠ΄ΠΆΠΈΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½.

Иногда Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±Π΅Π· Π΅Π³ΠΎ уничтоТСния. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ (ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ надпись):

gtk_widget_ref(GTK_WIDGET(label));

gtk_container_remove(GTK_CONTAINER(cont1), label);

gtk_container_add(GTK_CONTAINER(cont2), label);

Β«Π‘ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒΒ» Π²ΠΈΠ΄ΠΆΠΈΡ‚ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

void gtk_widget_hide(GtkWidget *w);

ΠžΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚ снова ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ функция gtk_widget_show().

Π’ΠΈΠ΄ΠΆΠΈΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· состояний:

♦ GTK_STATE_NORMAL β€” Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅;

♦ GTK_STATE_ACTIVE β€” Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΠΆΠ°Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ°);

♦ GTK_STATE_PRELIGTH β€” Π½Π°Π΄ Π²ΠΈΠ΄ΠΆΠΈΡ‚ΠΎΠΌ находится ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΌΡ‹ΡˆΠΈ;

♦ GTK_STATE_SELECTED β€” Π²ΠΈΠ΄ΠΆΠΈΡ‚ Π²Ρ‹Π±Ρ€Π°Π½ (установлСн фокус Π²Π²ΠΎΠ΄Π°);

♦ GTK_STATE_INSENSITIVE β€” Π²ΠΈΠ΄ΠΆΠΈΡ‚ Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° Π²Π²ΠΎΠ΄ (сигналы).

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ состояниС Π²ΠΈΠ΄ΠΆΠΈΡ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ:

GTK_WIDGET(w)->state

ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ макроса:

GTK_WIDGET_STATE(wid)

описанного Π² Ρ„Π°ΠΉΠ»Π΅ gtk/gtkwidget.h.

Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠΈΡ‚ Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ:

gtk_widget_set_sensitive(widget, FALSE);

Если Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_widget_set_sensitive() Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ TRUE, Π²ΠΈΠ΄ΠΆΠΈΡ‚ widget станСт Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ.

Π§Ρ‚ΠΎΠ±Ρ‹ наш Π²ΠΈΠ΄ΠΆΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» фокус Π²Π²ΠΎΠ΄Π°, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:

gtk_widget_grab_focus(widget);

23.4.2. Π£ΠΏΠ°ΠΊΠΎΠ²ΠΊΠ° Π²ΠΈΠ΄ΠΆΠΈΡ‚ΠΎΠ², поля Π²Π²ΠΎΠ΄Π° ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ