25 августа 2023 г.

Sciter – фреймверк для создания десктопного GUI максимально бытро

После небольшого исследования на предмет того как быстро создавать GUI для десктопа на C++ на сегодняшний день, помимо давно зарекомендовавших себя решений, таких как Qt или wxWidgets, набрел на довольно интересный фреймверк Sciter. В его подходе интересно то, что виджеты создаются веб-технологиями (HTML, CSS, Javascript) и при этом есть возможность вызывать функции, написанные на C++, собранные в бинарнике. Размер же собранного дистрибутива меньше 10 мегабайт! А в распоряжении программиста остается почти вся функциональность WebView. Всяким Электронам такое не светит в принципе. Поэтому решил попробовать собрать.

Дальше всё для платформы Windows x64 с GCC 8.1.0 из MinGW, в моем случае – Code::Blocks 20.03 с MinGW.

Качаем отсюда Sciter.JS SDK, распаковываем куда-нибудь, где всякие SDK лежат (например C:\sdk\sciter-js-sdk-main).

Устанавливаем переменную окружения SCITERSDK=C:\libraries\sciter-sdk.

Далее – повторяем инструкции 1 и 2, но здесь распишу их как они получились у меня.

Создаем пустой проект в Code::Blocks, настраиваем в Project-Build options:

  • слева выбираем все сборки
  • в Compiler settings включаем флаг -static
  • в Linker settings добавляем либы: winmm, ws2_32, libole32, а в опции -municode
  • в Search directories в Compiler добавляем папку заголовочных файлов (для примера выше – C:\sdk\sciter-js-sdk-main\include)
  • в Pre-build steps пишем packfolder.exe ui resources.cpp -v "resources"

В папке проекта создаем следующую структуру

папка проекта
  ├ папка ui
  ├ main.cpp (листинг 1)
  ├ packfolder.exe (копируем из `C:\sdk\sciter-js-sdk-main\bin\windows`)
  ├ resources.cpp (пустой, заполняется автоматически)
  └ sciter-win-main.cpp (копируем из `C:\sdk\sciter-js-sdk-main\include\`)

В папки bin\Debug и bin\Release копируем sciter.dll из C:\sdk\sciter-js-sdk-main\bin\windows\x64, чтобы запускалось.

В папку ui копируем проект из C:\sdk\sciter-js-sdk-main\samples.app\classic.

Добавляем в проект Code::Blocks файлы .cpp.

Собираем, запускаем.

В настройках проекта (Project-Properties-Build targets) можете поменять тип с Console application на GUI application, чтобы консоль не запускалась с вашим приложением.

Листинг 1

#include "sciter-x.h"
#include "sciter-x-window.hpp"

class frame: public sciter::window {
public:
  frame() : window(SW_TITLEBAR | SW_RESIZEABLE | SW_CONTROLS | SW_MAIN | SW_ENABLE_DEBUG) {}
};

#include "resources.cpp" // resources packaged into binary blob.

int uimain(std::function run ) {
  sciter::archive::instance().open(aux::elements_of(resources)); // bind resources[] (defined in "resources.cpp") with the archive
  sciter::om::hasset pwin = new frame();
  pwin->load( WSTR("this://app/main.htm") );
  pwin->expand();
  return run();
}

Комментариев нет:

Отправить комментарий