Основы программирования в Linux
Шрифт:
void gtk_entry_set_max_length(GtkEntry *entry, gint max);
G_CONST_RETURN gchar* gtk_entry_get_text(GtkEntry *entry);
void gtk_entry_set_text(GtkEntry *entry, const gchar *text);
void gtk_entry_append_text(GtkEntry *entry, const gchar *text);
void gtk_entry_prepend_text(GtkEntry* entry, const gchar *text);
void gtk_entry_set_visibility(GtkEntry *entry, gboolean visible);
void gtk_entry_set_invisible_char(GtkEntry *entry, gchar invch);
void gtk_entry_set_editable(GtkEntry *entry, gboolean editable);
Вы можете создать
GtkEntry
с помощью функции gtk_entry_new
или при вводе текста фиксированной длины с помощью функции gtk_entry_new_with_max_length
. Ограничение ввода определенной длиной текста избавляет вас от проверки корректности длины ввода и, возможно, необходимости информировать пользователя о том, что текст слишком длинный. Для получения содержимого виджета
GtkEntry
вызывайте функцию gtk_entry_get_text
, которая возвращает указатель const char
, внутренний по отношению к GtkEntry
(G_CONST_RETURN
— макрос, определенный в библиотеке GLib). Если вы хотите изменить текст или передать его в функцию, которая может его модифицировать, следует скопировать строку с помощью, например, функции strcpy
. Вы можете вручную задавать и изменять содержимое виджета
GtkEntry
, применяя функции _set_text
, _append_text
и _modify_text
. Учтите, что они принимают указатели const. Для применения
GtkEntry
в качестве поля ввода пароля, которое отображает звездочки на месте символов, воспользуйтесь функцией gtk_entry_set_visibility
, передав ей параметр visible
со значением FALSE
. Скрывающий символ можно изменить в соответствии с вашими требованиями с помощью функции gtk_entry_set_invisible_char
. Выполните упражнение 16.4.
Упражнение 16.4. Ввод имени пользователя или пароля
Теперь, познакомившись с функциями виджета GtkEntry, посмотрим на них в действии в небольшой программе. Программа entry.c будет создавать окно ввода имени пользователя и пароля и сравнивать введенный пароль с секретным.
1. Сначала определим секретный пароль, остроумно заданный как
secret
:
#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
const char * password = "secret";
2. У вас есть две функции обратного вызова, которые вызываются, когда уничтожается окно и щелкается мышью кнопка OK:
void closeApp(GtkWidget *window, gpointer data) {
gtk_main_quit;
}
void button_clicked(GtkWidget *button, gpointer data) {
const char *password_text =
gtk_entry_get_text(GTK_ENTRY((GtkWidget *) data));
if (strcmp(password_text, password) == 0)
printf("Access granted!\n");
else printf("Access denied!\n");
}
3. В функции
main
создается, компонуется интерфейс и связываются обратные вызовы с сигналами. Для компоновки виджетов меток и полей ввода примените виджеты-контейнеры hbox и vbox:
int main (int argc, char *argv[]) {
GtkWidget *window;
GtkWidget *username_label, *password_label;
GtkWidget *username_entry, *password_entry;
GtkWidget *ok_button;
GtkWidget *hbox1, *hbox2;
GtkWidget *vbox;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "GtkEntryBox");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_windowset_default_size(GTK_WINDOW(window), 200, 200);
g_signal_connect(GTK_OBJECT(window), "destroy",
GTK_SIGNAL_FUNC(closeApp), NULL);
username_label = gtk_label_new("Login:");
password_label = gtk_label_new("Password:");
username_entry = gtk_entry_new;
password_entry = gtk_entry_new;
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);
Поделиться:
Популярные книги
Третий. Том 2
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Я до сих пор не царь. Книга XXVII
27. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Камень. Книга 4
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Изгой Проклятого Клана. Том 4
4. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Третий. Том 3
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Гримуар темного лорда II
2. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Размышления русского боксёра в токийской академии Тамагава
1. Размышления русского боксёра в токийской академии
Фантастика:
альтернативная история
6.80
рейтинг книги
Содержанка. Книга 2
6. Порочная власть
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Камень. Книга шестая
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Очкарик
Фантастика:
фэнтези
5.75
рейтинг книги
Печать зверя
7. Артефактор
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Ст. сержант. Назад в СССР. Книга 5
5. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Законник Российской Империи
1. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Император Пограничья 9
9. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00