use windows::Win32::{ Foundation::*, Graphics::Direct2D::Common::*, Graphics::Direct2D::*, Graphics::Dxgi::Common::*, }; #[tokio::main] async fn main() { let mut root_rx = witas::EventReceiver::new(); let mut inner_rx = witas::EventReceiver::new(); let root = witas::Window::builder() .title("witas inner_window") .inner_size(witas::LogicalSize::new(640, 480)) .set_receiver(&root_rx) .await .unwrap(); let inner = witas::InnerWindow::builder(&root) .position(witas::LogicalPosition::new(10, 10)) .size(witas::LogicalSize::new(320, 240)) .set_receiver(&inner_rx) .await .unwrap(); let d2d_factory: ID2D1Factory = unsafe { D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, None).unwrap() }; let render_target = unsafe { let size = inner.size().await.unwrap(); let dpi = inner.dpi().await.unwrap() as f32; d2d_factory .CreateHwndRenderTarget( &D2D1_RENDER_TARGET_PROPERTIES { r#type: D2D1_RENDER_TARGET_TYPE_DEFAULT, pixelFormat: D2D1_PIXEL_FORMAT { format: DXGI_FORMAT_R8G8B8A8_UNORM, alphaMode: D2D1_ALPHA_MODE_UNKNOWN, }, dpiX: dpi, dpiY: dpi, ..Default::default() }, &D2D1_HWND_RENDER_TARGET_PROPERTIES { hwnd: HWND(inner.raw_handle() as _), pixelSize: D2D_SIZE_U { width: size.width, height: size.height, }, ..Default::default() }, ) .unwrap() }; let inner_task = tokio::spawn(async move { loop { let (event, _) = inner_rx.recv().await; match event { witas::Event::Draw(_) => unsafe { render_target.BeginDraw(); let clear_color = D2D1_COLOR_F { r: 0.0, g: 0.0, b: 0.3, a: 0.0, }; render_target.Clear(Some(&clear_color)); render_target.EndDraw(None, None).unwrap(); }, witas::Event::Closed => { println!("inner window closed"); break; } _ => {} } } }); loop { let (event, _) = root_rx.recv().await; match event { witas::Event::KeyInput(k) => match k.as_vkey_state() { (witas::VirtualKey::P, witas::KeyState::Pressed) => { inner.set_position(witas::LogicalPosition::new(50, 50)); } (witas::VirtualKey::S, witas::KeyState::Pressed) => { inner.set_size(witas::LogicalSize::new(100, 100)); } _ => {} }, witas::Event::Closed => { println!("root window closed"); break; } _ => {} } } inner_task.await.unwrap(); }