第一种
通过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.rc
把bmp
嵌入二进制,然后使用资源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 评论