スポンサーリンク
Winitはクロスプラットフォームの、Rustでウィンドウを生成するクレート。
ただしこれはウィンドウを生成する機能しか持っておらず、ボタンなどを設置する機能は持っていない。OpenGLもそのままでは使えずWindowsであればwglを使わないといけない。
[package]
name = "winittest"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
winit = "0.28.2"
Rust文法がまだよくわかっていなのでコードの整頓にとどめる。
use winit::{ event::{ Event, WindowEvent, DeviceId, ElementState }, event_loop::{ ControlFlow, EventLoop }, window::WindowBuilder, platform::windows::WindowExtWindows, // hwndを使うなら必要
dpi::PhysicalPosition, }; // https://github.com/rust-windowing/winit fn main() { // イベントループ let event_loop = EventLoop::new(); // ウィンドウ生成 let window = WindowBuilder::new() .with_inner_size(winit::dpi::LogicalSize::new(500, 300)) .with_title("winit") .build(&event_loop).unwrap(); // ウィンドウハンドルを取得 // let hwnd:winit::platform::windows::HWND = (window.hwnd() as isize); event_loop.run(move |event, _, control_flow| { *control_flow = ControlFlow::Wait; let mut pos: PhysicalPosition<f64>; // マウス座標の格納先 match event { /////////////////////////////////////////////// /////////////////////////////////////////////// // 条件 Event::WindowEvent { event: WindowEvent::CloseRequested, window_id, } if window_id == window.id() => // 処理 { *control_flow = ControlFlow::Exit } , /////////////////////////////////////////////// /////////////////////////////////////////////// // 条件 マウス移動 Event::WindowEvent { event:WindowEvent::CursorMoved { position:pos, .. }, window_id, } if window_id == window.id() => // 処理 { println!("{} {}",pos.x,pos.y); }, /////////////////////////////////////////////// /////////////////////////////////////////////// // 条件 左マウスボタン押下 Event::WindowEvent{ event: WindowEvent::MouseInput{ state:ElementState::Pressed, button:winit::event::MouseButton::Left, .. // 「..」で省略できる }, window_id, } if window_id == window.id() => // 処理 { println!("left pushed"); }, /////////////////////////////////////////////// /////////////////////////////////////////////// // 条件 右マウスボタン押下 Event::WindowEvent{ event: WindowEvent::KeyboardInput{ input:winit::event::KeyboardInput{ state:ElementState::Pressed, virtual_keycode:Some(winit::event::VirtualKeyCode::A), .. }, .. // 「..」で省略できる }, window_id, } if window_id == window.id() => // 処理 { println!("A pushed") }, /////////////////////////////////////////////// /////////////////////////////////////////////// // そのほか _ => (), } }); }