Last active
October 13, 2020 15:50
-
-
Save mjgil/9d2fb2f4d2e82db1e8a433a2b33dd4cf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://drywa.me/2017/07/02/simple-win32-window-with-rust/ | |
#![windows_subsystem = "windows"] | |
extern crate winapi; | |
extern crate user32; | |
extern crate kernel32; | |
use std::ffi::OsStr; | |
use std::os::windows::ffi::OsStrExt; | |
use std::iter::once; | |
use std::mem; | |
use std::ptr::null_mut; | |
use std::io::Error; | |
use self::user32::{ | |
DefWindowProcW, | |
RegisterClassW, | |
CreateWindowExW, | |
TranslateMessage, | |
DispatchMessageW, | |
GetMessageW, | |
}; | |
use self::winapi::HWND; | |
use self::kernel32::GetModuleHandleW; | |
use self::winapi::winuser::{ | |
MSG, | |
WNDCLASSW, | |
CS_OWNDC, | |
CS_HREDRAW, | |
CS_VREDRAW, | |
CW_USEDEFAULT, | |
WS_OVERLAPPEDWINDOW, | |
WS_VISIBLE, | |
}; | |
fn win32_string( value : &str ) -> Vec<u16> { | |
OsStr::new( value ).encode_wide().chain( once( 0 ) ).collect() | |
} | |
struct Window { | |
handle : HWND, | |
} | |
fn create_window( name : &str, title : &str ) -> Result<Window, Error> { | |
let name = win32_string( name ); | |
let title = win32_string( title ); | |
unsafe { | |
let hinstance = GetModuleHandleW( null_mut() ); | |
let wnd_class = WNDCLASSW { | |
style : CS_OWNDC | CS_HREDRAW | CS_VREDRAW, | |
lpfnWndProc : Some( DefWindowProcW ), | |
hInstance : hinstance, | |
lpszClassName : name.as_ptr(), | |
cbClsExtra : 0, | |
cbWndExtra : 0, | |
hIcon: null_mut(), | |
hCursor: null_mut(), | |
hbrBackground: null_mut(), | |
lpszMenuName: null_mut(), | |
}; | |
RegisterClassW( &wnd_class ); | |
let handle = CreateWindowExW( | |
0, | |
name.as_ptr(), | |
title.as_ptr(), | |
WS_OVERLAPPEDWINDOW | WS_VISIBLE, | |
CW_USEDEFAULT, | |
CW_USEDEFAULT, | |
CW_USEDEFAULT, | |
CW_USEDEFAULT, | |
null_mut(), | |
null_mut(), | |
hinstance, | |
null_mut() ); | |
if handle.is_null() { | |
Err( Error::last_os_error() ) | |
} else { | |
Ok( Window { handle } ) | |
} | |
} | |
} | |
fn handle_message( window : &mut Window ) -> bool { | |
unsafe { | |
let mut message : MSG = mem::uninitialized(); | |
if GetMessageW( &mut message as *mut MSG, window.handle, 0, 0 ) > 0 { | |
TranslateMessage( &message as *const MSG ); | |
DispatchMessageW( &message as *const MSG ); | |
true | |
} else { | |
false | |
} | |
} | |
} | |
fn main() { | |
let mut window = create_window( "my_window", "Hello Windows" ).unwrap(); | |
loop { | |
if !handle_message( &mut window ) { | |
break; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment