2015-10-27 95 views
1

我是C++的新手,我使用的是Visual Studio 2012的MFC 如何在浏览按钮的图片控件中显示图片? Browse(浏览)按钮点击,我的路径设置为一样,显示图片来自浏览按钮

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

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

SRY基因,但什么是m_PictureCtrl?这是身份证吗? – user3552658

+1

我已经扩展了添加m_PictureCtrl定义的答案。 –

+0

非常感谢!我在哪里可以找到Do Data Exchange的另一个问题?我仍在搜索它 – user3552658