Win32 GUI and related APIs in safe, idiomatic Rust.
WinSafe has:
If you're looking for a comprehensive Win32 coverage, take a look at winapi or windows crates, which are unsafe, but have everything.
Documentation for the WinSafe master
branch: rodrigocfd.github.io/winsafe/winsafe
This crate is still in early alpha stage. Below is an estimated progress of feature groups:
| Feature group | Estimated progress |
| - | - |
| User windows (main, modal and control) | |
| Native controls |
|
| Window messages |
|
| Overall Win32 APIs |
| |
Note: You can find several examples in the dedicated repo: github.com/rodrigocfd/winsafe-examples
First, put this in your Cargo.toml
:
toml
[dependencies]
winsafe = "0.0.2"
WinSafe allows you to create windows in two ways:
.res
or .rc
files.The example below creates a window with a button programmatically. Note how the click event is handled with a closure:
```rust
use winsafe::{gui, POINT, SIZE, WinResult};
fn main() { let my = MyWindow::new(); // instantiate our main window if let Err(e) = my.wnd.run_main(None) { // ... and run it eprintln!("{}", e); } }
pub struct MyWindow { wnd: gui::WindowMain, // responsible for managing the window btn_hello: gui::Button, // a button }
impl MyWindow { pub fn new() -> MyWindow { let wnd = gui::WindowMain::new( // instantiate the window manager gui::WindowMainOpts { title: "My window title".to_owned(), size: SIZE::new(300, 150), ..Default::default() // leave all other options as default }, );
let btn_hello = gui::Button::new(
&wnd, // the window manager is the parent of our button
gui::ButtonOpts {
text: "&Click me".to_owned(),
position: POINT::new(20, 20),
..Default::default()
},
);
let new_self = Self { wnd, btn_hello };
new_self.events(); // attach our events
new_self
}
fn events(&self) {
let wnd = self.wnd.clone(); // clone so it can be passed into the closure
self.btn_hello.on().bn_clicked(move || {
wnd.hwnd().SetWindowText("Hello, world!").unwrap();
});
}
} ```
Licensed under MIT license, see LICENSE.md for details.