在编写mfc对话框时,经常会用到图片控件,用来直观显示目标对象的外观样式。对于静态位图bmp,在对话框上显示非常简单,只需将该图片插入资源中,在对话框上引用即可。而对于动态切换png图片的场景,例如切换下拉框的同时切换示意图片,mfc同样提供了解决方案。
在切换下拉框时,动态加载所需png图片。
在OnPaint函数中绘制图片
void OnListBoxChange()
{
// 这里的路径可以按需修改
std::string filePath = "D:\\test.png";
// 动态加载png图片
if (m_Image) m_Image.Detach();
if (m_Image.Load(filePath.c_str()) == S_OK)
{
// 重绘图片控件
CRect rect;
GetDlgItem(IDC_STATIC_PICTURE)->GetWindowRect(&rect);
ScreenToClient(rect);
InvalidateRect(rect);
}
}
void OnPaint()
{
CDialogEx::OnPaint();
if (m_Image)
{
CPaintDC dc(GetDlgItem(IDC_STATIC_PICTURE));
CRect rectClient;
GetDlgItem(IDC_STATIC_PICTURE)->GetClientRect(&rectClient);
// 图片对象关联
CBitmap bitMap;
bitMap.Attach(m_Image);
// 创建图片绘图设备dc
CDC dcMemory;
dcMemory.CreateCompatibleDC(&dc);
auto pOldObject = dcMemory.SelectObject(&bitMap);
// 复制图片到图片控件
// 当图片与控件尺寸一致时,使用BitBlt函数
// 如果不一致时,使用StretchBlt函数进行缩放
//dc.BitBlt()
dc.StretchBlt(rectClient.left, rectClient.top, rectClient.Width(), rectClient.Height(),
&dcMemory, 0, 0, m_Image.GetWidth(), m_Image.GetHeight(), SRCCOPY);
dcMemory.SelectObject(pOldObject);
}
}