在对telops相机二次开发时需要用picture control控件显示相机采集的HBITMAP图像,结合大佬的经验,总结一下把bitmap转成HBITMAP再显示的方法:
1、在MFC对话框程序中添加picture control控件和一个button,目的是按下button显示一张本地bmp图像
2、修改picture control控件的ID,否则无法添加变量
3、选中picture control右键选择添加control变量
4、在button的响应函数中添加如下代码:
HBITMAP hbmp = NULL;
hbmp = (HBITMAP)LoadImage(NULL,
TEXT("D:\\test.bmp"),
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
float cx, cy, dx, dy, k, t;
CRect rect;
CImage cimage;
//cimage.Load(_T("D:\\wer.bmp"));
cimage.Attach(hbmp);
cx = cimage.GetWidth();
cy = cimage.GetHeight();
k = cy / cx;
CWnd *pWnd = NULL;
pWnd = GetDlgItem(PictureShow);
pWnd->GetClientRect(&rect);
dx = rect.Width();
dy = rect.Height();
t = dy / dx;
if (k >= t)
{
rect.right = floor(rect.bottom / k);
rect.left = (dx - rect.right) / 2;
rect.right = floor(rect.bottom / k) + (dx - rect.right) / 2;
}
else
{
rect.bottom = floor(k*rect.right);
rect.top = (dy - rect.bottom) / 2;
rect.bottom = floor(k*rect.right) + (dy - rect.bottom) / 2;
}
CDC *pDc = NULL;
pDc = pWnd->GetDC();
int ModeOld = SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE);
GetDlgItem(PictureShow)->ShowWindow(FALSE);
GetDlgItem(PictureShow)->ShowWindow(TRUE);
cimage.StretchBlt(pDc->m_hDC, rect, SRCCOPY);
SetStretchBltMode(pDc->m_hDC, ModeOld);
ReleaseDC(pDc);
DeleteObject(hbmp);
hbmp = NULL;
这样就可以实现在picture control控件上按原比例显示bitmap
LoadImage返回值为空可参考解决LoadImage函数返回值为空的问题
结果如下: