MFC/ATL框架编辑控件带有CImage
类,允许你加载图像(PNG,JPEG,BMP,GIF等格式的支持)。为了在图片控件中显示目标图片,您需要使用CStatic::SetBitmap()
方法。 CImage
类实现Detach()
方法,该方法允许您直接访问HBITMAP
对象。下面是一个例子:
的m_PictureCtrl
是在对话框窗口头文件中定义这样的:
CStatic m_PictureCtrl;
它使用标准MFC数据交换机构映射到IDC_PIC_STATIC
控制ID。
void CTestPicDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PIC_STATIC, m_PictureCtrl);
}
浏览按钮的处理程序是这样的:
CFileDialog dlg(TRUE);
if (dlg.DoModal() == IDOK)
{
CString sPath = dlg.GetPathName();
CImage img;
HRESULT hr = img.Load(sPath);
if (FAILED(hr))
{
CString sErrorMsg;
sErrorMsg.Format(_T("Failed to load %s"), sPath);
AfxMessageBox(sErrorMsg);
return;
}
CRect rect;
m_PictureCtrl.GetClientRect(rect);
int nWidth = rect.Width();
int nHeight = rect.Height();
CDC* pScreenDC = GetDC();
CDC MemDC;
MemDC.CreateCompatibleDC(pScreenDC);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pScreenDC, nWidth, nHeight);
CBitmap *pOldObj = MemDC.SelectObject(&bmp);
img.StretchBlt(MemDC.m_hDC, 0, 0, nWidth, nHeight, 0, 0, img.GetWidth(), img.GetHeight(), SRCCOPY);
MemDC.SelectObject(pOldObj);
m_PictureCtrl.SetBitmap((HBITMAP)bmp.Detach());
ReleaseDC(pScreenDC);
}
SRY基因,但什么是m_PictureCtrl?这是身份证吗? – user3552658
我已经扩展了添加m_PictureCtrl定义的答案。 –
非常感谢!我在哪里可以找到Do Data Exchange的另一个问题?我仍在搜索它 – user3552658