В этой статье пос­мотрим и испы­таем на реаль­ных задачах биб­лиоте­ку Ultra App Kit. Это сов­ремен­ный кросс‑плат­формен­ный фрей­мворк для C++, который поз­воля­ет писать окон­ные при­ложе­ния и широко при­меня­ет пос­ледние стан­дарты C++14 и С++17. С ним удоб­но исполь­зовать интеллек­туаль­ные ука­зате­ли и дру­гие воз­можнос­ти сов­ремен­ных «плю­сов».

В октябре 2025 года выш­ла финаль­ная вер­сия игро­вого движ­ка Ultra Engine (пре­дыду­щие пару лет он находил­ся в ран­нем дос­тупе). Но речь пой­дет не о нем. Побоч­ным про­дук­том его раз­работ­ки ста­ла биб­лиоте­ка визу­аль­ных ком­понен­тов Ultra App Kit, исполь­зуемая в самом движ­ке для пос­тро­ения поль­зователь­ско­го интерфей­са.

Я дав­но сле­жу за раз­работ­кой это­го движ­ка и твор­чес­твом ее ведуще­го раз­работ­чика Джо­ша Клин­та. Сна­чала биб­лиоте­ка сто­ила денег, но теперь игро­вую сос­тавля­ющую про­дали, а Ultra App Kit сде­лали бес­плат­ной. Ultra Engine же, судя по инсай­дер­ской информа­ции, пере­име­нуют в Leadwerks 5.

Ultra App Kit — это прос­той в исполь­зовании SDK для соз­дания новомод­ного интерфей­са в тем­ных тонах.

info

Пос­ле того как Apple прек­ратила под­дер­жку бинар­ного фор­мата исполня­емых фай­лов x86-64 в macOS, лаун­чер SDK перес­тал запус­кать­ся, так что в дан­ный момент фрей­мворк кросс‑плат­формен­ный не в пол­ной мере. Одна­ко SDK мож­но самос­тоятель­но прик­рутить к ком­пилято­ру и все же исполь­зовать в новых вер­сиях macOS на про­цес­сорах серии M.

Пе­ред накаты­вани­ем SDK позаботь­ся о том, что­бы у тебя был Visual Studio, — что­бы было на что накаты­вать. Я буду исполь­зовать вер­сию 2022, но с тем же успе­хом мож­но взять Visual Studio 2019 или 2026, если тебя соб­лазнил Copilot.

Са­ма Ultra App Kit ста­вит­ся из Steam (ска­зыва­ется игро­вое прош­лое). В Windows и macOS Catalina уста­нов­щик авто­матом про­писы­вает пути ком­пилято­ра к биб­лиоте­кам и заголо­воч­ным фай­лам. Даль­ше работу SDK буду демонс­три­ровать в Windows.

Страница загрузки Ultra App Kit в Steam
Стра­ница заг­рузки Ultra App Kit в Steam
 

Создаем приложение на Ultra App Kit

Пос­ле запус­ка уста­нов­ленной прог­раммы на экра­не появит­ся окно лаун­чера. На вклад­ке Projects ты можешь соз­дать про­ект, открыть име­ющий­ся или импорти­ровать. На вклад­ке Learn мож­но получить дос­туп к докумен­тации на сай­те раз­работ­чика.

Лаунчер Ultra App Kit для создания программ
Ла­унчер Ultra App Kit для соз­дания прог­рамм

info

Ес­ли вмес­то лаун­чера ты видишь окно для вво­да логина и пароля, про­верь, не заб­локиро­ван ли каким‑либо обра­зом дос­туп в интернет.

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

Задание расположения создаваемого проекта
За­дание рас­положе­ния соз­дава­емо­го про­екта

Пос­ле это­го допол­нитель­ный пункт, свя­зан­ный с соз­данным про­ектом, будет добав­лен в спи­сок в окне лаун­чера. Вмес­те с этим откро­ется окно про­вод­ника, в нем отоб­разит­ся содер­жимое пап­ки сге­нери­рован­ного про­екта, отку­да в Visual Studio мож­но открыть файл решения.

 

Разбираем код типового приложения

Ти­пич­ное при­ложе­ние, не счи­тая внеш­них зависи­мос­тей, сос­тоит из двух фай­лов: main.cpp и UltraEngine.cpp. В пос­леднем — лишь вклю­чение заголо­воч­ного фай­ла UltraEngine.h. Все дей­ство раз­ворачи­вает­ся в пер­вом. По сво­ей струк­туре и прин­ципам исполне­ния содер­жимое похоже на клас­сичес­кое при­ложе­ние для Windows: в точ­ке вхо­да — фун­кции wWinMain запус­кает­ся бес­конеч­ный цикл для обра­бот­ки пос­тупа­ющих от опе­раци­онной сис­темы сооб­щений.

Типичная функция wWinMain классического приложения Windows
Ти­пич­ная фун­кция wWinMain клас­сичес­кого при­ложе­ния Windows

Код Ultra App:

#include "UltraEngine.h"
using namespace UltraEngine;
int main(int argc, const char* argv[])
{
// Получить от системы все подключенные мониторы
auto displays = GetDisplays();
// Создание окна приложения
auto window = CreateWindow("Ultra Engine", 0, 0, 800, 600, displays[0], WINDOW_TITLEBAR | WINDOW_RESIZABLE | WINDOW_CENTER);
// Создать пользовательский интерфейс
auto ui = CreateInterface(window);
// Получить размер области для размещения виджетов
auto sz = ui->root->GetSize();
// Создать виджет вертикальный список
auto listbox = CreateListBox(20, 20, sz.x - 40, sz.y - 40, ui->root);
// Добавить первый элемент и сделать его активным
listbox->AddItem("Item 1", true);
// Добавить остальные пять элементов
listbox->AddItem("Item 2");
listbox->AddItem("Item 3");
listbox->AddItem("Item 4");
listbox->AddItem("Item 5");
listbox->AddItem("Item 6");
// Закрепить края списка
listbox->SetLayout(1,1,1,1);
// Бесконечный цикл обработки событий
while (true)
{
const Event ev = WaitEvent();
switch (ev.id)
{
// Событие вызывается при двойном нажатии
case EVENT_WIDGETACTION:
Print("Item " + String(ev.data) + " action");
break;
// Событие вызывается при одиночном нажатии
case EVENT_WIDGETSELECT:
Print("Item " + String(ev.data) +" selected");
break;
// Событие происходит при выходе из приложения
case EVENT_QUIT:
// Событие происходит при закрытии окна приложения
case EVENT_WINDOWCLOSE:
return 0;
break;
default: break;
}
}
return 0;
}
Стандартное приложение для Windows
Стан­дар­тное при­ложе­ние для Windows

Код при­ложе­ния очень пря­моли­ней­ный: все эле­мен­ты, сос­тавля­ющие окно, опи­сыва­ются (соз­дают­ся) свер­ху вниз, а в кон­це кру­тит­ся бес­конеч­ный цикл.

Пос­ле запус­ка и ини­циали­зации при­ложе­ния вызыва­ется фун­кция GetDisplays, которая воз­вра­щает век­тор объ­ектов клас­са Display. Объ­ект это­го клас­са пре­дос­тавля­ет парамет­ры монито­ра. К компь­юте­ру в наше вре­мя их может быть под­клю­чено нес­коль­ко.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии