我是C++的新手,并且正在使用Visual Studio 2012的MFC
如何通过浏览按钮在图片控件中显示图像?
在单击浏览按钮时,我将路径设置为这样的编辑控件
void CSimilarityOfImagesDlg::OnBnClickedButton1()
{
CFileDialog dlg(TRUE);
int iRet = dlg.DoModal();
CString path = dlg.GetPathName();
SetWindowText (path);
CEdit* cedit;
cedit = reinterpret_cast<CEdit *>(GetDlgItem(IDC_EDIT1));
cedit->SetWindowTextW(path);
cedit->GetWindowTextW(path);
}
最佳答案
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);
}