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 / egui | UI на Rust, кроссплатформа | свой виджетный набор, реже «родные» контролы |
| Dioxus + WebView | React-подобная модель | молодая экосистема, 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 |
| egui | immediate mode — удобно для редакторов и отладочных панелей |
«Immediate mode» в egui значит: каждый кадр вы заново описываете, какие кнопки нарисовать; состояние храните сами. Подходит для инструментов, где важна скорость разработки, а не пиксель-перфект как у системных диалогов.
Практическая рекомендация по сценарию
- Утилита или прототип — egui (
eframe) или Iced: быстрый старт, одинcargo add. - Продукт с веб-командой — Tauri.
- Промышленный HMI, встраиваемые экраны — Slint.
- Интеграция в Win32/COM legacy — windows-rs + FFI.
- Microsoft Store, Fluent, глубокая интеграция с Windows 11 — WinUI 3 (отдельная траектория; опыт C#/C++ с XAML сильно помогает).
Частые ошибки
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
| WebView2 missing | на машине нет runtime | установить WebView2 Runtime или bootstrap из документации Tauri |
Паника в Win32 unsafe | неверный HWND или вызов не из UI-потока | проверить поток создания окна; Win32 UI обычно однопоточный |
| Tauri IPC denied | команда не в allowlist capabilities | добавить команду в конфиг capabilities |
| Размытый egui на 4K | DPI scaling | настроить with_pixels_per_point в eframe |
Что попробовать руками
- egui — проект
eframe, одно окно с кнопкой (cargo add eframe). - Tauri — шаблон
create-tauri-app, сравните размер установки с Electron. - Логику без UI сначала вынесите в библиотеку и проверьте через Axum или тесты — UI подключите позже.
Связанные материалы
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). История Rust - путь языка от эксперимента до промышленного стандарта безопасного системного программирования. Rust — это многопарадигменный язык программирования общего назначения, который фокусируется на безопасности памяти, производительности и параллелизме. Набор советов, правил, принципов и обычаев в разработке на этом языке. Трейты могут иметь методы по умолчанию. Если тип не переопределяет метод, используется версия из трейта. Это позволяет расширять функциональность без изменения базового кода. Простые приложения на Rust — CLI, файлы, JSON и минимальный HTTP на stdlib и tokio. fn - ключевое слово, которое обозначает начало объявления функции. Функция представляет собой именованный блок кода, выполняющий конкретную задачу. В данном случае функция называется main. Экосистема приложений на Rust - направления применения языка и ключевые инструменты промышленной разработки. Системное программирование на Rust - низкоуровневый контроль, безопасность памяти и надёжные инфраструктурные компоненты. Кавычки, точки, запятые, скобки и прочие знаки препинания. Ключевые слова Rust - назначение операторов и зарезервированных идентификаторов в синтаксисе языка. Встроенные функции и стандартная библиотека Rust - базовые макросы, атрибуты и инструменты тестирования. Типизация, набор правил определения типа данных значений языка.История языка Rust
Что требуется знать перед началом изучения языка программирования Rust
Рекомендации по разработке на Rust
Rust для начинающих
Простые приложения на Rust
Основы языка Rust
Экосистема приложений на Rust
Системное программирование на Rust
Синтаксис и пунктуация в Rust
Ключевые слова языка Rust
Встроенные функции и стандартная библиотека
Типы данных и владение памятью