wiard 0.8.0

Window handling library for Windows in Rust
Documentation
use raw_window_handle::HasWindowHandle;
use windows::Win32::{
    Foundation::HWND,
    Graphics::Direct2D::Common::*,
    Graphics::Direct2D::*,
    Graphics::Dxgi::Common::*,
    System::Com::{COINIT_DISABLE_OLE1DDE, COINIT_MULTITHREADED, CoInitializeEx},
};

fn main() -> anyhow::Result<()> {
    unsafe {
        CoInitializeEx(None, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE).ok()?;
    }
    let mut event_rx = wiard::EventReceiver::new();
    let main_window = wiard::Window::builder(&event_rx)
        .title("wiard inner window")
        .build()?;
    let inner_window = wiard::InnerWindow::builder(&event_rx, &main_window)
        .position(wiard::LogicalPosition::new(10, 10))
        .size(wiard::LogicalSize::new(256, 256))
        .build()?;
    let d2d1_factory: ID2D1Factory =
        unsafe { D2D1CreateFactory(D2D1_FACTORY_TYPE_MULTI_THREADED, None)? };
    let render_target = unsafe {
        let size = inner_window.size().unwrap();
        let dpi = inner_window.dpi().unwrap() as f32;
        let raw_window_handle::RawWindowHandle::Win32(handle) =
            inner_window.window_handle().unwrap().as_raw()
        else {
            unreachable!()
        };
        let hwnd = HWND(isize::from(handle.hwnd) as *mut _);
        d2d1_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,
                pixelSize: D2D_SIZE_U {
                    width: size.width,
                    height: size.height,
                },
                ..Default::default()
            },
        )?
    };
    loop {
        let Some((event, window)) = event_rx.recv() else {
            break;
        };
        match event {
            wiard::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)?;
            },
            wiard::Event::MouseInput(m) => {
                let b = m.button == wiard::MouseButton::Left
                    && m.button_state == wiard::ButtonState::Pressed;
                if b {
                    if window == main_window {
                        println!("main_window");
                    } else if window == inner_window {
                        println!("inner_window");
                    }
                }
            }
            _ => {}
        }
    }
    Ok(())
}