显示图像从浏览按钮

时间:2015-10-27 11:12:50

标签: c++ mfc

我是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);

}

1 个答案:

答案 0 :(得分:1)

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);
}

Browse Button处理程序如下所示:

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);
}