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