windows-rs中获取HBITMAP实例的两种方法

第一种

通过include_bytes嵌入资源,然后手动转换成HINSTANCE实例

pub fn get_tile_image() -> HBITMAP {
    const BMPFHSZ: usize = std::mem::size_of::<BITMAPFILEHEADER>();
    const BMPIHSZ: usize = std::mem::size_of::<BITMAPINFOHEADER>();
    const RGBQSZ: usize = std::mem::size_of::<RGBQUAD>();
    const TILE_IMAGE: &[u8] = include_bytes!("./bitmap.bmp");
    unsafe {
        let bmpfh = std::mem::transmute_copy::<[u8; BMPFHSZ], BITMAPFILEHEADER>(
            TILE_IMAGE[0..BMPFHSZ]
                .try_into()
                .map_err(|_| E_INVALIDARG)
                .unwrap(),
        );
        let bmpih = std::mem::transmute_copy::<[u8; BMPIHSZ], BITMAPINFOHEADER>(
            TILE_IMAGE[BMPFHSZ..BMPFHSZ + BMPIHSZ]
                .try_into()
                .map_err(|_| E_INVALIDARG)
                .unwrap(),
        );
        let rgb = std::mem::transmute_copy::<[u8; RGBQSZ], RGBQUAD>(
            TILE_IMAGE[BMPFHSZ + BMPIHSZ..BMPFHSZ + BMPIHSZ + RGBQSZ]
                .try_into()
                .map_err(|_| E_INVALIDARG)
                .unwrap(),
        );
        let bmpi = BITMAPINFO {
            bmiColors: [rgb],
            bmiHeader: bmpih,
        };
        let tile = &TILE_IMAGE[bmpfh.bfOffBits as usize..] as *const _ as *const c_void;
        let dib_section =
            CreateDIBSection(None, &bmpi, DIB_RGB_COLORS, ptr::null_mut(), None, 0).unwrap();
        SetDIBits(
            None,
            dib_section,
            0,
            bmpih.biHeight as u32,
            tile,
            &bmpi,
            DIB_RGB_COLORS,
        );
        dib_section
    }
}

第二种

通过resource.rcbmp嵌入二进制,然后使用资源ID获取


pub fn get_tile_image() -> HBITMAP {
    const IDB_TILE_IMAGE: u16 = 101;

    // 获取当前模块句柄
    let hinst = get_hinstance().unwrap();

    // 尝试加载位图
    let hbmp: HBITMAP = unsafe { LoadBitmapW(hinst, PCWSTR(IDB_TILE_IMAGE as *const u16)) };

    if hbmp.is_invalid() {
        // 获取最后一次错误以进行诊断
        let error_code = unsafe { GetLastError().0 };
        log_print(format!("Failed to load bitmap. Error code: {}", error_code).as_str());
    } else {
        log_print("Successfully loaded bitmap");
        // 在这里可以添加更多对位图的操作或测试。
    }
    hbmp
}

需要在DllMain中保存实例,get_hinstance获取实例

嵌入rc资源的方式查看embed-resource第三方库

0 评论