Created
December 4, 2018 16:31
-
-
Save NoCheroot/afb0414f4de3fa62970b73c4255ff07e to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| #![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