среда, 21 ноября 2007 г.

Пример iupdialog2.c

Рассмтрим стандартный пример из поставки 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.
Общий алгоритм действий для создания диалога выглядит так:
  1. Создать контролы.
  2. Создать элементы группировки (IupHbox, IupVbox, IupZbox, IupFill), которые в качестве параметров принимают уже проинициализированные хендлы контролов.
  3. Создать диалог, который принимает в качестве родителя самый "верхний" в иерархии элемент группировки или контрол.

1 комментарий:

Alexey Yakovenko комментирует...

как по мне - порядок инициализации вполне обычный, как в gtk :)