1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
| #![windows_subsystem = "windows"]
use winapi::{
um::{
winuser::{RegisterClassW, WNDCLASSW, CS_HREDRAW, CS_VREDRAW,
LoadIconW, IDI_APPLICATION, LoadCursorW, IDC_ARROW,
CreateWindowExW, ShowWindow, SW_NORMAL, UpdateWindow,
GetMessageW, TranslateMessage, DispatchMessageW, MSG,
WM_DESTROY, PostQuitMessage, DefWindowProcW, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT},
wingdi::{GetStockObject, WHITE_BRUSH},
},
shared::{
windef::{HWND, HBRUSH},
minwindef::{UINT, WPARAM, LPARAM, LRESULT},
},
};
use std::ptr;
use std::mem;
fn main() {
unsafe {
let class_name = encode("my_window_class_name");
if !register_wndclass(&class_name) {
return;
}
let hwnd = create_window(&class_name);
if hwnd.is_null() {
return;
}
ShowWindow(hwnd, SW_NORMAL);
UpdateWindow(hwnd);
let mut msg = mem::uninitialized::<MSG>();
loop {
if GetMessageW(&mut msg, ptr::null_mut(), 0, 0) == 0 {
return;
}
TranslateMessage(&mut msg);
DispatchMessageW(&mut msg);
}
}
}
fn encode(source: &str) -> Vec<u16> {
source.encode_utf16().chain(Some(0)).collect()
}
unsafe fn register_wndclass(class_name: &[u16]) -> bool {
let mut winc = mem::zeroed::<WNDCLASSW>();
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = Some(win_proc);
winc.hIcon = LoadIconW(ptr::null_mut(), IDI_APPLICATION);
winc.hCursor = LoadCursorW(ptr::null_mut(), IDC_ARROW);
winc.hbrBackground = GetStockObject(WHITE_BRUSH as i32) as HBRUSH;
winc.lpszClassName = class_name.as_ptr();
RegisterClassW(&winc) > 0
}
unsafe fn create_window(class_name: &[u16]) -> HWND {
CreateWindowExW(
0,
class_name.as_ptr(),
encode("Hello, World!").as_ptr(),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
ptr::null_mut(),
ptr::null_mut(),
ptr::null_mut(),
ptr::null_mut(),
)
}
unsafe extern "system" fn win_proc(hwnd: HWND, msg: UINT, w_param: WPARAM, l_param: LPARAM) -> LRESULT {
match msg {
WM_DESTROY => PostQuitMessage(0),
_ => return DefWindowProcW(hwnd, msg, w_param, l_param),
};
0
}
|