Шрифт:
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
ok_button = gtk_button_new_with_label("Ok");
g_signal_connect(GTK_OBJECT(ok_button), "clicked",
GTK_SIGNAL_FUNC(button_clicked), password_entry);
hbox1 = gtk_hbox_new(TRUE, 5);
hbox2 = gtk_hbox_new(TRUE, 5);
vbox = gtk_vbox_new(FALSE, 10);
gtk_box_pack_start(GTK_BOX(hbox1), username_label, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox1), username_entry, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_label, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox2), password_entry, TRUE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), ck_button, FALSE, FALSE, 5);
gtk_container_add(GTK_CONTAINER(window), vbox);
gtk_widget_show_all(window);
gtk_main;
return 0;
}
Когда вы запустите программу, то получите окно, показанное на рис. 16.8.
Рис. 16.8
Как это работает
Программа создает два виджета типа
GtkEntry
, username_entry
и password_entry
, а также задает видимость password_entry
, равной FALSE
, чтобы скрыть введенный пароль. Затем она формирует кнопку GtkButton
, с помощью которой вы связываете сигнал clicked
с функцией обратного вызова button_clicked
. Как только в функции обратного вызова программа извлечет введенный пароль и сравнит его с секретным паролем, на экран выводится соответствующее сообщение.
Обратите внимание на то, что для вставки виджетов в свои контейнеры вы много раз повторили операторы
gtk_box_pack_start
. Для сокращения этого повторяющегося программного кода в последующих примерах будет определена вспомогательная функция. GtkSpinButton
Порой вам нужно, чтобы пользователь ввел числовое значение, например, максимальную скорость или размер инструмента, и в такой ситуации виджет
GtkSpinButton
(кнопка-счетчик) идеален. Он ограничивает ввод пользователя только цифровыми символами и можно задать диапазон допустимых значений от нижней до верхней границы. Виджет также содержит стрелки, направленные вверх и вниз, так что пользователь может "накручивать" значение, для удобства пользуясь только мышью.
GtkWidget
+---- GtkEntry
+---- GtkSpinButton
И снова API понятен, и мы перечислим наиболее часто применяемые вызовы:
GtkWidget* gtk_spin_button_new(GtkAdjustment *adjustment,
gdouble climb_rate, guint digits);
GtkWidget* gtk_spin_button_new_with_range(gdouble min, gdouble max,
gdouble step);
void gtk_spin_button_set_digits(GtkSpinButton *spin_button, guint digits);
void gtk_spin_button_set_increments(GtkSpinButton *spin_button,
gdouble step, gdouble page);
void gtk_spin_button_set_range(GtkSpinButton *spin_button, gdouble min,
gdouble max);
gdouble gtk_spin_button_get_value(GtkSpinButton *spin_button);
gint gtk_spin_button_get_value_as_int(GtkSpinButton *spin_button);
void gtk_spin_button_set_value(GtkSpinButton *spin button, gdouble value);
Для создания виджета
GtkSpinButton
с помощью функции gtk_spin_button_new
вы сначала должны создать объект GtkAdjustment
. Виджет GtkAdjustment
— это абстрактный объект, содержащий логику, касающуюся управления значениями с ограничениями. Он также применяется и в других виджетах, таких как GtkHScale
и GtkVScale
.