Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Выполните упражнение 16.1.

Упражнение 16.1. Обычное окно

GtkWindow

Давайте начнем программирование средствами GTK+ с простейшей из программ GUI — отображения окна. Вы увидите библиотеки GTK+ в действии и большой набор функциональных возможностей, получаемых из очень короткого программного кода.

1. Введите программу и назовите ее gtk1.с:

#include <gtk/gtk.h>

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

 GtkWidget *window;

 gtk_init(&argc, &argv);

 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

 gtk_widget_show(window);

 gtk_main;

 return 0;

}

2. Для

компиляции gtk1.c введите следующую команду:

$ gcc gtk1.c -о gtk1 `pkg-config --cflags --libs gtk+-2.0`

Примечание

Будьте внимательны и набирайте обратные апострофы, а не обычные апострофы — помните о том, что обратные апострофы — это инструкции, заставляющие оболочку выполнить заключенную в них команду и добавить ее вывод в конец строки.

Когда вы выполните программу с помощью следующей команды, ваше окно должно раскрыться (рис. 16.4).

$ ./gtk1

Рис. 16.4 

Учтите, что вы можете перемещать окно, изменять его размер, сворачивать и раскрывать его на весь экран.

Как это работает

Включить заголовочные файлы, необходимые для библиотек GTK+ и связанных с ними библиотек, можно с помощью одного оператора

#include <gtk/gtk.h>
. Далее вы объявляете окно как указатель на объект
GtkWidget
.

Затем для инициализации библиотек GTK+ следует выполнить вызов

gtk_init
, передав аргументы командной строки
argc
и
argv
. Это дает возможность GTK+ выполнить синтаксический анализ любых параметров командной строки, о которых комплект должен знать. Учтите, что вы всегда должны инициализировать GTK+ таким способом перед вызовом любых функций GTK+.

Суть примера заключается в вызове функции

gtk_window_new
. Далее приведен ее прототип:

GtkWidget* gtk_window_new(GtkWindowType type);

Параметр type может принимать в зависимости от назначения окна одно из двух значений:

 

GTK_WINDOW_TOPLEVEL
— стандартное окно с рамкой;

 

GTK_WINDOW_POPUP
— окно без рамки, подходящее для диалогового окна.

Почти всегда вы будете применять значение

GTK_WINDOW_TOPLEVEL
, потому что для создания диалоговых окон, как вы узнаете позже, есть гораздо более удобные способы.

Вызов

gtk_window_new
создает окно в памяти, таким образом у вас появляется возможность перед реальным выводом окна на экран заполнить его виджетами, изменить размер окна, его заголовок и т.д. Для того чтобы окно появилось на экране, выполните вызов функции
gtk_widget_show
:

gtk_widget_show(window);

Эта

функция принимает указатель типа
GtkWidget
, поэтому вы просто предоставляете ссылку на свое окно.

Последним вы выполняете вызов функции

gtk_main
. Эта основная функция запускает процесс обмена информацией (interactivity process), передавая управление GTK+, и не возвращает его до тех пор, пока не будет выполнен вызов функции
gtk_main_quit
. Как видно в программе gtk1.с, этого никогда не происходит, поэтому приложение не завершается даже после закрытия окна. Проверьте это, щелкнув кнопкой мыши пиктограмму закрытия окна и убедившись в отсутствии строки, приглашающей вводить команду. Вы исправите это поведение после того, как познакомитесь с сигналами и обратными вызовами в следующем разделе. Сейчас завершите приложение, нажав комбинацию клавиш <Ctrl>+<C> в окне командной оболочки, которое вы использовали для запуска программы gtk1.

События, сигналы и обратные вызовы

У всех библиотек GUI есть нечто общее. Должен существовать некий механизм для выполнения программного кода в ответ на действие пользователя. Программа, выполняющаяся в режиме командной строки, может позволить себе останов выполнения в ожидании ввода и затем применить нечто вроде оператора выбора для выполнения разных ветвей программы в зависимости от введенных данных. Такой подход нецелесообразен в случае приложения GUI, поскольку оно должно непрерывно реагировать на ввод пользователя, например, ему приходится постоянно обновлять области окна.

У современных оконных систем есть система событий и приемники событий, которым адресована эта задача. Идея заключается в том, что каждый пользовательский ввод обычно с помощью мыши или клавиатуры инициирует событие. Нажатие на клавиатуре, например, вызовет "событие клавиатуры". Затем пишется программный код, который ждет приема такого события и выполняется в случае его возникновения.

Как вы уже видели, эти события генерирует система X Window System, но они мало помогут вам как программисту GTK+, т.к. они очень низкоуровневые. Когда производится щелчок кнопкой мыши, X порождает событие, содержащее координаты указателя мыши, а вам нужно знать, когда пользователь активизирует виджет.

У GTK+ есть собственная система событий и приемников событий, называемых сигналами и обратными вызовами. Их очень легко применять, поскольку для установки обработчика сигнала можно использовать очень полезное свойство языка С, указатель на функцию.

Сначала несколько определений. Сигнал GTK+ порождается объектом типа

GtkObject
, когда происходит нечто, например, ввод пользователя. Функция, связанная с сигналом и, следовательно, вызываемая при любом порождении сигнала, называется функцией обратного вызова.

Примечание

Имейте в виду, что сигнал GTK+ — это нечто иное, чем сигнал UNIX, обсуждавшийся в главе 11.

Как программист, использующий GTK+, вы должны заботиться только о написании и связывании функций обратного вызова, поскольку код порождения сигнала — это внутренний программный код определенного виджета.

Прототип или заголовок функции обратного вызова обычно похож на следующий:

void a_callback_function(GtkWidget *widget, gpointer user_data);

Поделиться:
Популярные книги

Основы общей психологии

Рубинштейн Сергей Леонидович
Мастера психологии
Научно-образовательная:
психология
5.00
рейтинг книги
Основы общей психологии

Красный священник

Юань Е
4. Повелитель тайн
Фантастика:
фэнтези
эпическая фантастика
5.00
рейтинг книги
Красный священник

Молчун-Неучтённый фактор. Компиляция. Книги 1-22

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Молчун-Неучтённый фактор. Компиляция. Книги 1-22

Последняя схватка

Зевако Мишель
9. История рода Пардальянов
Приключения:
исторические приключения
6.25
рейтинг книги
Последняя схватка

Полное собрание сочинений

По Эдгар Аллан
Фантастика:
ужасы и мистика
5.00
рейтинг книги
Полное собрание сочинений

Тихий Дон. Том 2

Шолохов Михаил Александрович
Проза:
советская классическая проза
3.67
рейтинг книги
Тихий Дон. Том 2

Царевна Софья

Карнович Евгений Петрович
Всемирная история в романах
Проза:
историческая проза
6.25
рейтинг книги
Царевна Софья

Судьба

Золотарёв-Якутский Николай Гаврилович
Проза:
историческая проза
советская классическая проза
5.00
рейтинг книги
Судьба

Меченосцы

Сенкевич Генрик
Проза:
историческая проза
6.25
рейтинг книги
Меченосцы

80000 кіламетраў пад вадой

Верн Жуль
Приключения:
морские приключения
5.00
рейтинг книги
80000 кіламетраў пад вадой

Второгодка. Книга 4. Подавать холодным

Ромов Дмитрий
4. Второгодка
Фантастика:
героическая фантастика
альтернативная история
сказочная фантастика
6.25
рейтинг книги
Второгодка. Книга 4. Подавать холодным

Повелитель Орлов. Дилогия (самое полное издание с концовками Том 1, Том 2)

Смолин Александр
Повелитель Орлов
Фантастика:
фэнтези
эпическая фантастика
героическая фантастика
боевая фантастика
6.80
рейтинг книги
Повелитель Орлов. Дилогия (самое полное издание с концовками Том 1, Том 2)

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.25
рейтинг книги
Дважды одаренный. Том V

Дружба

Фриза
Любовные романы:
современные любовные романы
9.07
рейтинг книги
Дружба