Рассмтрим стандартный пример из поставки IUP. Он довольно выразительный и раскрывает концепции функций обратного вызова, системы атрибутов. Ключевые строки будут мной прокомментированы (комментарии в стиле С99).
// Подключение единственного заголовочного файла
#include "iup.h"// объявим хендлы для диалогов
// это наш callback
int quit_cb(void)
{
return IUP_CLOSE;
}
int main(void)
{
Ihandle *dialog, *quit_bt, *vbox;
// Инициализируем библиотеку. Вобще, автору стоило бы проверять код
// ошибки.
// Кстати, библиотека может быть непроинициализированна только в Linux.
// В остальных OS она всегда успешно инициализируется.
IupOpen();
// Получаем хендл созданной кнопки с текстом "Quit". Второй параметр функции
// оставлен только для совместимости со старым методом регистрации CALLBACK
// и сейчас его лучше не использовать, передавая NULL.
// Автору лучше проверить не вернула ли IupButton() значение NULL?
// После создания кнопки, она не сразу отображается, ведь у неё ещё нет родителя.
quit_bt = IupButton("Quit", 0);
// Новый метод регистрации callback funciton.
// Указываем, что для элемента quit_bt будет зарегистрирована коллбэк функция
// quit_cb. Параметры функций обратного вызова могут быть различными, но всегда
// они должны приводится к типу Icallback, который является указателем на функцию.
// Второй параметр "ACTION" - это имя действия, после совершения которого будет
// вызвана наша функция обратного вызова
IupSetCallback(quit_bt, "ACTION", (Icallback)quit_cb);
/* the container with a label and the button */
// Создаём контейнер (вертикальная группировка) с контролом "метка" и
// 1 кнопкой.
vbox = IupVbox(
IupSetAttributes(IupLabel("Very Long Text Label"), "EXPAND=YES,
ALIGNMENT=ACENTER"),
quit_bt,
0);
// Указываем атрибуты для элемента вертикальной группировки
IupSetAttribute(vbox, "ALIGNMENT", "ACENTER");
IupSetAttribute(vbox, "MARGIN", "10x10");
IupSetAttribute(vbox, "GAP", "5");
// Получаем хендл только что созданного диалга, который принимает в качестве
// ребёнка элемент группировки vbox. Т.о. диалог становится родителем для vbox.
dialog = IupDialog(vbox);
// Устанавливаем атрибут титула диалога как "Dialog Title"
IupSetAttribute(dialog, "TITLE", "Dialog Title");
// Отрисовываем немодальный диалог со всеми контролами
IupShow(dialog);
// Запуск цикла обработки сообщений. Выход из него будет произведён, если не будет
// ни одного диалога, либо кто-то из обработчиков вернёт IUP_CLOSE.
IupMainLoop();
// Уничтожить вручную диалог. Все дети диалога уничтожатся автоматически
IupDestroy(dialog);
// Деинициализация библиотеки и освобождение ресурсов
IupClose();
return 0;
}
Вот так всё просто оказалось. Единственное, на что может обратить внимание внимательный читатель -- это порядок создания диалога и размещения в нём элементов. Он не такой, как в большинстве библиотек для построения GUI.
Общий алгоритм действий для создания диалога выглядит так:
- Создать контролы.
- Создать элементы группировки (IupHbox, IupVbox, IupZbox, IupFill), которые в качестве параметров принимают уже проинициализированные хендлы контролов.
- Создать диалог, который принимает в качестве родителя самый "верхний" в иерархии элемент группировки или контрол.
1 комментарий:
как по мне - порядок инициализации вполне обычный, как в gtk :)
Отправить комментарий