使用Rust在Windows上开发GUI应用的方法

最近想用Rust在Windows平台上开发一个GUI应用,但不太清楚该选择哪个框架比较好。目前了解到有egui、iced、tauri等选项,不知道它们各自有什么优缺点?另外,在Windows上开发时需要注意哪些兼容性问题?希望能得到一些实际开发经验分享,比如如何打包发布、如何处理Windows特有的API调用等问题。

2 回复

在Windows上使用Rust开发GUI应用,主要有以下几种方法:

  1. 原生Windows API:通过windowswinapicrate直接调用Win32 API,适合熟悉Windows编程的开发者,但代码较繁琐。

  2. Tauri框架:轻量级方案,前端使用HTML/CSS/JS,后端用Rust,打包体积小,安全性高,适合Web开发者转型。

  3. Slint:声明式UI框架,支持多种后端,性能较好,语法类似QML,适合现代GUI开发。

  4. egui:即时模式GUI,简单易用,适合工具类应用,但样式定制性较弱。

  5. GTK绑定:通过gtk-rs使用GTK库,跨平台但依赖GTK运行时。

推荐新手从Tauri或Slint开始,平衡学习成本和功能需求。若追求性能和原生体验,可研究Win32 API直接开发。


在Windows上使用Rust开发GUI应用,主要有以下几种主流方法:

1. 原生Windows API (windows-rs crate)

use windows::{
    core::*,
    Win32::UI::WindowsAndMessaging::*,
};

fn main() -> Result<()> {
    unsafe {
        let hinstance = GetModuleHandleW(None)?;
        
        let window_class = WNDCLASSW {
            style: CS_HREDRAW | CS_VREDRAW,
            lpfnWndProc: Some(def_window_proc),
            hInstance: hinstance.into(),
            lpszClassName: w!("MyWindow"),
            ..Default::default()
        };
        
        RegisterClassW(&window_class);
        
        CreateWindowExW(
            WINDOW_EX_STYLE::default(),
            w!("MyWindow"),
            w!("Hello World"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            800,
            600,
            None,
            None,
            hinstance,
            None,
        );
        
        MessagePump(None)?;
    }
    
    Ok(())
}

2. 使用Tauri框架

Tauri使用Web技术构建桌面应用,推荐用于现代GUI开发:

# Cargo.toml
[package]
name = "tauri-app"
version = "0.1.0"

[dependencies]
tauri = { version = "1.0", features = ["api-all"] }

[build-dependencies]
tauri-build = { version = "1.0" }
// src/main.rs
fn main() {
    tauri::Builder::default()
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

3. 使用egui (即时模式GUI)

use eframe::egui;

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions::default();
    eframe::run_native(
        "My egui App",
        options,
        Box::new(|_cc| Box::new(MyApp::default())),
    )
}

#[derive(Default)]
struct MyApp;

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.heading("Hello World!");
            if ui.button("Click me").clicked() {
                println!("Button clicked!");
            }
        });
    }
}

4. 使用Slint (声明式GUI)

slint::slint! {
    export component MainWindow inherits Window {
        Text {
            text: "Hello, World!";
            color: green;
        }
    }
}

fn main() {
    MainWindow::new().unwrap().run().unwrap();
}

推荐方案

  • 初学者/快速开发: 推荐Tauri或egui
  • 性能要求高: 考虑原生Windows API或Slint
  • 跨平台需求: Tauri、egui、Slint都支持跨平台

Tauri是目前最流行的选择,结合了Web技术的易用性和Rust的性能优势。

回到顶部