Способы создания, конфигурации и функционализации окон
В дополнение к базовым функциям отображения двумерной геометрии библиотека μGUI также поддерживает окна. Каждое окно может содержать несколько виджетов, таких как кнопки, текстовые поля и изображения. В этом разделе дается описание основных методов управления окнами.
Каждому окну нужен уникальный буфер объектов. В этом буфере будут храниться все ассоциированные объекты. Его размер определяет максимально взможное число ассоциированных с окном виджетов.
Связь между окном и объектным буфером устанавливается путем вызова функции UG_WindowCreate(). Функция также подключает к окну набор обработчиков, которые будут вызываться при определенных событиях. После создания окна библиотека μGUI берет на себя все процессы, связанные с окном:
Поскольку разные объекты имеют разную структуру, не все их данные могут храниться в буфере объектов. Отсюда, каждый объект дополнительно нуждается в собственном контейнере (например, UG_BUTTON
button_1) для хранения специфичных данных. Процесс связывания контейнера с окном происходит путем вызова соответствующего конструктора (например, UG_ButtonCreate()).
Пример:
void window_1_callback( UG_MESSAGE *msg ){// ...}#define MAX_OBJECTS 10int 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(). Данную функцию необходимо эпизодически вызывать для перерисовки оконной сцены. Обычно это делается в ответ на прерывание, либо периодически в фоновом режиме (например, по таймеру).
![]() | Отсутствие этого вызова приведет к невозможности любой интерактивности инетрфейса. Эту функцию нефвно использует слой интеграции с 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