Создание окна

Способы создания, конфигурации и функционализации окон

В дополнение к базовым функциям отображения двумерной геометрии библиотека μGUI также поддерживает окна. Каждое окно может содержать несколько виджетов, таких как кнопки, текстовые поля и изображения. В этом разделе дается описание основных методов управления окнами.

uGUI.png
Рисунок 1. Пример окна в библиотеке μGUI

Управление окнами

Каждому окну нужен уникальный буфер объектов. В этом буфере будут храниться все ассоциированные объекты. Его размер определяет максимально взможное число ассоциированных с окном виджетов.

uGUI-wm.png
Рисунок 2. Механизм буфера объектов

Связь между окном и объектным буфером устанавливается путем вызова функции UG_WindowCreate(). Функция также подключает к окну набор обработчиков, которые будут вызываться при определенных событиях. После создания окна библиотека μGUI берет на себя все процессы, связанные с окном:

Поскольку разные объекты имеют разную структуру, не все их данные могут храниться в буфере объектов. Отсюда, каждый объект дополнительно нуждается в собственном контейнере (например, UG_BUTTON button_1) для хранения специфичных данных. Процесс связывания контейнера с окном происходит путем вызова соответствующего конструктора (например, UG_ButtonCreate()).

Пример:

void window_1_callback( UG_MESSAGE *msg )
{
// ...
}
#define MAX_OBJECTS 10
int main ( void )
{
UG_WINDOW window 1; /* Window */
UG_BUTTON button1; /* Button container */
UG_BUTTON button2; /* Button container */
UG_BUTTON button3; /* Button container */
UG_OBJECT obj_buff_wnd_1[MAX_OBJECTS]; /* Object buffer */
// ...
/* Create the window (link the object buffer and the callback function to the window) */
UG_WindowCreate( &window_1, obj_buff_wnd_1, MAX_OBJECTS, window_1_callback );
/* Create some buttons (link each object container to the window) */
UG_ButtonCreate( &window_1, &button_1, BTN_ID_0, 10, 10, 110, 60 );
UG_ButtonCreate( &window_1, &button_2, BTN_ID_1, 10, 80, 110, 130 );
UG_ButtonCreate( &window_1, &button_3, BTN_ID_2, 10, 150, 110, 200 );
/* Finally, show the window */
UG_WindowShow( &window_1 );
// . . .
}

Функция обновления

Библиотека также управляет процессом обновления окон и дочерних объектов. Это выполняется внутренней функцией UG_Update(). Данную функцию необходимо эпизодически вызывать для перерисовки оконной сцены. Обычно это делается в ответ на прерывание, либо периодически в фоновом режиме (например, по таймеру).


Caution: Отсутствие этого вызова приведет к невозможности любой интерактивности инетрфейса. Эту функцию нефвно использует слой интеграции с Graphics Framework.

Обработчики

При создании окно ассоциируется со специальным обработчиком. Поступление в окно события будет сгенерировано сообщение, которое будет передано в функцию обработчик.

Пример:

void window_1_callback( UG_MESSAGE *msg )
{
if ( msg->type == MSG_TYPE_OBJECT )
{
if ( msg->id == OBJ_TYPE_BUTTON )
{
switch ( msg->sub_id )
{
case BTN_ID_0:
{
/* Do something! */
break;
}
}
}
}
}




Предыдущий раздел: Библиотека μGUI