Skip to main content

hello_win/
hello-win.rs

1use std::ptr::null_mut;
2
3use winapi::shared::minwindef::{HINSTANCE, LPARAM, LRESULT, UINT, WPARAM};
4use winapi::shared::windef::HWND;
5use winapi::um::wingdi::CreateSolidBrush;
6use winapi::um::winuser::{
7    LoadCursorW, LoadIconW, PostQuitMessage, ShowWindow, IDC_ARROW, IDI_APPLICATION, SW_SHOWNORMAL,
8    WM_DESTROY, WS_OVERLAPPEDWINDOW,
9};
10
11use win_win::{WindowBuilder, WindowClass, WindowProc};
12
13struct MyWindowProc;
14
15impl WindowProc for MyWindowProc {
16    fn window_proc(
17        &self,
18        _hwnd: HWND,
19        msg: UINT,
20        _wparam: WPARAM,
21        _lparam: LPARAM,
22    ) -> Option<LRESULT> {
23        println!("msg {}", msg);
24        if msg == WM_DESTROY {
25            unsafe {
26                PostQuitMessage(0);
27            }
28        }
29        None
30    }
31}
32
33fn main() {
34    unsafe {
35        let icon = LoadIconW(0 as HINSTANCE, IDI_APPLICATION);
36        let cursor = LoadCursorW(0 as HINSTANCE, IDC_ARROW);
37        let brush = CreateSolidBrush(0xff_ff_ff);
38        let win_class = WindowClass::builder("rust")
39            .icon(icon)
40            .cursor(cursor)
41            .background(brush)
42            .build()
43            .unwrap();
44        let hwnd = WindowBuilder::new(MyWindowProc, &win_class)
45            .name("win-win example")
46            .style(WS_OVERLAPPEDWINDOW)
47            .build();
48        ShowWindow(hwnd, SW_SHOWNORMAL);
49        win_win::runloop(null_mut());
50    }
51}