Перейти к основному содержимому

GUI на Windows — выбор стека

Разработчику Архитектору

GUI на Windows — выбор стека

О чём эта глава

GUI (Graphical User Interface) — окна, кнопки, поля ввода, меню. На Windows интерфейс можно строить по-разному: через системные API Microsoft, через кроссплатформенные библиотеки на Rust или через гибрид (логика на Rust, картинка в WebView).

Цель статьи — помочь выбрать стек, а не научить за один вечер писать Win32. Для старта в Rust разумнее первая программа и при необходимости веб-API на Axum; GUI подключают, когда появляется задача «нужно окно на рабочем столе».

Обзор: приложения на Rust · фреймворки · нативный код: FFI.


Базовые термины

ТерминПростыми словами
Нативный UIРисует система Windows (кнопки выглядят как в других программах ОС).
Собственный рендерФреймворк сам рисует интерфейс (OpenGL, WGPU, свой движок).
WebViewВ окне встроен мини-браузер (HTML/CSS/JS), Rust — «бэкенд».
HWNDИдентификатор окна в Win32.
Цикл сообщенийБесконечный цикл: ОС присылает события (клик, закрытие), программа их обрабатывает.
COM / WinRTМодель объектов Microsoft для современных API (WinUI, часть системных служб).

Карта вариантов

ПодходПлюсыМинусы
Win32 / windows-rsмаксимальная интеграция с ОС, без лишних слоёвмного кода, ручной цикл сообщений, много unsafe
WinUI 3 / WinRTсовременный Fluent, Microsoft Storeв основном Windows, крутая кривая COM
Tauriзнакомый HTML/CSS, относительно малый установщикWebView2, настройка IPC и прав
Slint / Iced / eguiUI на Rust, кроссплатформасвой виджетный набор, реже «родные» контролы
Dioxus + WebViewReact-подобная модельмолодая экосистема, API меняется

Когда имеет смысл нативный API (Win32, windows-rs)

Подходит, если нужно:

  • встроить Rust-модуль в существующее Win32-приложение;
  • вызвать редкий системный API без готовой safe-обёртки;
  • минимальный размер и нулевая зависимость от WebView.

Типичная схема: crate windows или windows-sys даёт объявления функций; тонкий слой unsafe изолируют в одном модуле; бизнес-логика остаётся на safe Rust (FFI и дисциплина). Цикл GetMessage / DispatchMessage держат в одном месте; обработчики WM_* остаются короткими.

Для первого знакомства с языком ручной Win32 — тяжёлый старт. Сначала освойте Cargo и ownership, затем возвращайтесь к нативному UI при явной необходимости.


Когда Tauri или другой WebView

  • команда уже пишет интерфейс на React / Vue / Svelte;
  • нужен установщик под Windows, macOS и Linux из одной кодовой базы;
  • важны автообновления, системные диалоги, разграничение прав.

Rust отвечает за файлы, сеть, криптографию, работу с ОС; UI живёт в изолированном WebView. Безопасность строят на явном списке команд (capabilities): JavaScript не получает произвольный доступ к диску — только то, что вы экспортировали в Rust.

На Windows Tauri опирается на WebView2 (движок Edge Chromium). На свежих Windows 10/11 runtime часто уже установлен; иначе нужен bootstrap-установщик Microsoft. Это компромисс: полный Electron не тащите, но компонент WebView2 остаётся зависимостью.


Когда Slint, Iced, egui

  • интерфейс должен выглядеть одинаково на Linux, macOS и Windows;
  • нельзя или нежелательно тянуть Chromium/WebView2;
  • HMI, встраиваемые панели, внутренние утилиты.
ФреймворкИдея
Slintдекларативные .slint-файлы, компиляция в Rust
Icedархитектура в духе Elm, рендер через wgpu/OpenGL
eguiimmediate mode — удобно для редакторов и отладочных панелей

«Immediate mode» в egui значит: каждый кадр вы заново описываете, какие кнопки нарисовать; состояние храните сами. Подходит для инструментов, где важна скорость разработки, а не пиксель-перфект как у системных диалогов.


Практическая рекомендация по сценарию

  1. Утилита или прототипegui (eframe) или Iced: быстрый старт, один cargo add.
  2. Продукт с веб-командойTauri.
  3. Промышленный HMI, встраиваемые экраныSlint.
  4. Интеграция в Win32/COM legacywindows-rs + FFI.
  5. Microsoft Store, Fluent, глубокая интеграция с Windows 11WinUI 3 (отдельная траектория; опыт C#/C++ с XAML сильно помогает).

Частые ошибки

СимптомВероятная причинаЧто сделать
WebView2 missingна машине нет runtimeустановить WebView2 Runtime или bootstrap из документации Tauri
Паника в Win32 unsafeневерный HWND или вызов не из UI-потокапроверить поток создания окна; Win32 UI обычно однопоточный
Tauri IPC deniedкоманда не в allowlist capabilitiesдобавить команду в конфиг capabilities
Размытый egui на 4KDPI scalingнастроить with_pixels_per_point в eframe

Что попробовать руками

  1. egui — проект eframe, одно окно с кнопкой (cargo add eframe).
  2. Tauri — шаблон create-tauri-app, сравните размер установки с Electron.
  3. Логику без UI сначала вынесите в библиотеку и проверьте через Axum или тесты — UI подключите позже.

Связанные материалы


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).