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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 178

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

Для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° GtkAdjustment ΠΏΠ΅Ρ€Π΅Π΄Π°ΠΉΡ‚Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ниТнюю ΠΈ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ приращСния.

GtkObject* gtk_adjustment_new(gdouble value, gdouble lower,

 gdouble upper, gdouble step_increment,

 gdouble page_increment, gdouble page_size);

ЗначСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² step_increment ΠΈ page_increment Π·Π°Π΄Π°ΡŽΡ‚ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ минимального ΠΈ максимального ΠΏΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠΉ, Π’ случаС ΠΊΠ½ΠΎΠΏΠΊΠΈ-счСтчика GtkSpinButton ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ step_increment опрСдСляСт, насколько измСнится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ ΠΌΡ‹ΡˆΡŒΡŽ стрСлки Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ page_increment ΠΈ page_size Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°Ρ… GtkSpinButton Π½Π΅ Π²Π°ΠΆΠ½Ρ‹.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, climb_rate, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_spin_button_new управляСт ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π½ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ со стрСлкой. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ digits Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ прСдставлСния числового значСния, Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, Ссли, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, digits Ρ€Π°Π²Π΅Π½ 3, ΠΊΠ½ΠΎΠΏΠΊΠ°-счСтчик ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ 0.00.

Ѐункция gtk_spin_button_new_with_range β€” ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ способ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° GtkAdjustment. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°Π΄Π°ΠΉΡ‚Π΅ ниТнюю ΠΈ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ приращСния.

ΠŸΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ благодаря Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_spin_button_getvalue, Π° Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ†Π΅Π»ΠΎΠ΅ число, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ gtk_spin_button_get_value_as_int.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.5.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.5. ИспользованиС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° GtkSpinButton

БСйчас ΠΌΡ‹ посмотрим Π² ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠ°ΠΊ дСйствуСт ΠΊΠ½ΠΎΠΏΠΊΠ°-счСтчик GtkSpinButton. НазовитС Ρ„Π°ΠΉΠ» spin.с.

#include <gtk/gtk.h>


void closeApp(GtkWidget *window, gpointer data) {

 gtk_main_quit();

}


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

 GtkWidget* window;

 GtkWidget *spinbutton;

 GtkObject *adjustment;

 gtk_init(&argc, &argv);

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);

 g_signal_connect(GTK_OBJECT(window), "destroy",

  GTK_SIGNAL_FUNC(closeApp), NULL);

 adjustment = gtk_adjustment_new(100.0, 50.0, 150.0, 0.5, 0.05, 0.05);

 spinbutton = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), 0.01, 2);

 gtk_container_add(GTK_CONTAINER(window), spinbutton);

 gtk_widget_show_all(window);

 gtk_main();

 return 0;

}

Когда Π²Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ-счСтчик, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΡƒΡŽ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 50–150 (рис. 16.9).

Рис. 16.9 

GtkButton

Π’Ρ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΠΈ GtkButton Π² дСйствии, Π½ΠΎ сущСствуСт нСсколько Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² GtkButton, с Ρ‡ΡƒΡ‚ΡŒ большими Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ возмоТностями, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ упоминания.

GtkButton

 +----GtkToggleButton

       +----GtkCheckButton

             +----GtkRadioButton

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΊΠ½ΠΎΠΏΠΊΠ°-ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° GtkToggleButton β€” прямой ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ GtkButton, ΠΊΠ½ΠΎΠΏΠΊΠ°-Ρ„Π»Π°ΠΆΠΎΠΊ GtkCheckButton β€” ΠΊΠ½ΠΎΠΏΠΊΠΈ-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ GtkToggleButton ΠΈ Ρ‚ΠΎ ΠΆΠ΅ самоС для ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ GtkRadioButton, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡.

GtkToggleButton

Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ GtkToggleButton ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ GtkButton Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ Π²Π°ΠΆΠ½ΠΎΠΉ Π΄Π΅Ρ‚Π°Π»ΠΈ: GtkToggleButton ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ состояниСм. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΈΠ»ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π°. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚ ΠΌΡ‹ΡˆΡŒΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ GtkToggleButton, послСдний стандартным способом ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ сигнал clicked ΠΈ измСняСт (ΠΈΠ»ΠΈ "ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚") своС состояниС.

API Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° GtkToggleButton ΠΎΡ‡Π΅Π½ΡŒ простой:

GtkWidget* gtk_toggle_button_new(void);

GtkWidget* gtk_toggle_button_new_with_label(const gchar* label);

gboolean gtk_toggle_button_get_active(GtkToggleButton *toggle_button);

void gtk_toggle_button_set_active(GtkToggleButton *toggle_button,

 gboolean is_active);

НаиболСС интСрСсныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” gtk_toggle_button_get_active ΠΈ gtk_toggle_button_set_active, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ для чтСния ΠΈ установки состояния ΠΊΠ½ΠΎΠΏΠΊΠΈ-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ. Если характСристика функционирования Ρ€Π°Π²Π½Π° TRUE, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ GtkToggleButton Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°.

GtkCheckButton

Кнопка-Ρ„Π»Π°ΠΆΠΎΠΊ GtkCheckButton β€” это замаскированная ΠΊΠ½ΠΎΠΏΠΊΠ°-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ GtkToggleButton. ВмСсто скучного ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ отобраТСния GtkToggleButton ΠΊΠ½ΠΎΠΏΠΊΠ° GtkCheckButton выводится ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π»Π°ΠΆΠΎΠΊ с располоТСнным рядом тСкстом. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π½Π΅Ρ‚.

GtkWidget* gtk_check_button_new(void);

GtkWidget* gtk_check_button_new_with_label(const gchar *label);

GtkRadioButton

Π­Ρ‚Π° ΠΊΠ½ΠΎΠΏΠΊΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ…, Ρ‚.ΠΊ. ΠΌΠΎΠΆΠ΅Ρ‚ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ (ΠΈΠ»ΠΈ Ρ€Π°Π΄ΠΈΠΎΠΊΠ½ΠΎΠΏΠΊΠ°) GtkRadioButton β€” ΠΎΠ΄Π½Π° ΠΈΠ· Ρ‚Π΅Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ…. Имя заимствовано Ρƒ старых Ρ€Π°Π΄ΠΈΠΎΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠ² с мСханичСскими ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выскакивали с трСском, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ Π² ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ состояниС, ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ.

GtkWidget* gtk_radio_button_new(GSList *group);

GtkWidget* gtk_radio_button_new_from_widget(GtkRadioButton *group);

GtkWidget* gtk_radio_button_new_with_label(GSList *group, const gchar *label);

void gtk_radio_button_set_group(GtkRadioButton *radio_button, GSList *group);

GSList* gtk_radio_button_get_group(GtkRadioButton *radio_button);

Π“Ρ€ΡƒΠΏΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Π΅ΠΉ прСдставлСна Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅-спискС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ GLib, Π½Π°Π·Π²Π°Π½Π½ΠΎΠΌ GSList. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΠΈ Π² Π³Ρ€ΡƒΠΏΠΏΡƒ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ GSList ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ gtk_radio_button_new ΠΈ gtk_radio_button_get_group, Π΅ΡΡ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΈΠΉ способ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gtk_radio_button_new_with_widget, которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² GSList ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ. Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π΅Π΅ Π² дСйствии Π² ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 16.6, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ GtkButton.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 16.6. GtkCheckButton, GtkToggleButton ΠΈ GtkRadioButton

Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст Π² Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ buttons.с.

1. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

#include <gtk/gtk.h>

#include <stdio.h>


GtkWidget *togglebutton;

GtkWidget *checkbutton;

GtkWidget *radiobutton1, *radiobutton2;

void closeApp(GtkWidget *window, gpointer data) {

 gtk_main_quit();

}

2. Π”Π°Π»Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ GtkWidget ΠΈ GtkLabel Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ GtkHbox ΠΈ Π·Π°Ρ‚Π΅ΠΌ вставляСт этот GtkHbox Π² Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚- ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄:

void add_widget_with_label(GtkContainer * box, gchar * caption,

 GtkWidget * widget) {

 GtkWidget *label = gtk_label_new(caption);

 GtkWidget *hbox = gtk_hbox_new(TRUE, 4);

 gtk_container_add(GTK_CONTAINER(hbox), label);

 gtk_container_add(GTK_CONTAINER(hbox), widget);

 gtk_container_add(box, hbox);

}

3. print_active β€” Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция, которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ-Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ GtkToggleButton со строкой описания. Он вызываСтся ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ button_clicked, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, связанной с сигналом clicked ΠΊΠ½ΠΎΠΏΠΊΠΈ OK. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ ΠΌΡ‹ΡˆΡŒΡŽ этой ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π½Π° экранС ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ состоянии ΠΊΠ½ΠΎΠΏΠΎΠΊ:

void print_active(char * button_name, GtkToggleButton* button) {

 gboolean active = gtk_toggle_button_get_active(button);

 printf("%s is %s\n", button_name, active?"active":"not active");

}


void button_clicked(GtkWidget *button, gpointer data) {

 print_active("Checkbutton", GTK_TOGGLE_BUTTON(checkbutton));

 print_active("Togglebutton", GTK_TOGGLE_BUTTON(togglebutton));

 print_active("Radiobutton1", GTK_TOGGLE_BUTTON(radiobutton1));

 print_active("Radiobutton2", GTK_TOGGLE_BUTTON(radiobutton2));

 printf("\n");

}

4. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main Π²Ρ‹ создаСтС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚Π΅ ΠΈΡ… Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ GtkVBox, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΏΠΎΡΡΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ, ΠΈ связываСтС сигнал ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ OK:

gint main(gint argc, gchar *argv[]) {

 GtkWidget* window;

 GtkWidget *button;

 GtkWidget *vbox;

 gtk_init(&argc, &argv);

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

 g_signal_connect(GTK_OBJECT(window), "destroy",

  GTK_SIGNAL_FUNC(closeApp), NULL);

 button = gtk_button_new_with_label("Ok");

 togglebutton = gtk_toggle_button_new_with_label("Toggle");

 checkbutton = gtk_check_button_new();

 radiobutton1 = gtk_radio_button_new(NULL);

 radiobutton2 =

  gtk_radio_button_new_from_widget(GTK_RADIO_BUTTON(radiobutton1));

 vbox = gtk_vbox_new(TRUE, 4);

 add_widget_with_label(GTK_CONTAINER(vbox), "ToggleButton:",

  togglebutton);

 add_widget_with_label(GTK_CONTAINER(vbox), "CheckButton:",

  checkbutton);

 add_widget_with_label(GTK_CONTAINER(vbox), "Radio 1:", radiobutton1);

 add_widget_with_label(GTK_CONTAINER(vbox), "Radio 2:", radiobutton2);

 add_widget_with_label(GTK_CONTAINER(vbox), "Button:", button);

 g_signal_connect(GTK_OBJECT(button), "clicked",

  GTK_SIGNAL_FUNC(button_clicked), NULL);

 gtk_container_add(GTK_CONTAINER(window), vbox);

 gtk_widget_show_all(window);

 gtk_main();

 return 0;

}

На рис. 16.10 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° buttons.c Π² дСйствии с Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ GtkButton Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… часто примСняСмых Ρ‚ΠΈΠΏΠΎΠ².