如何使用双缓冲在对话框中显示图片
完整代码如下,其中 IDC_EMPPHOTO 为标准图像控件:
static TCHAR BASED_CODE szFilter[] = _T("JPG Files (*.jpg)|*.jpg|All Files (*.*)|*.*||");
CFileDialog dlg(TRUE, _T("JPG"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if (dlg.DoModal() == IDOK)
{
strPhotoPathName = dlg.GetPathName();
if (strPhotoPathName != _T(""))
{
CWnd *pWnd = GetDlgItem(IDC_EMPPHOTO);
CRect rect;
pWnd->GetClientRect(&rect);
CDC *pDC = pWnd->GetDC();
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
IPicture *pPic;
if (file.Open(strPhotoPathName,CFile::modeRead)&&file.GetStatus(strPhotoPathName,fstatus)&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.Read(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
if(FAILED(pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox(_T("渲染图像失败!"));
pPic->Release();
}
else
AfxMessageBox(_T("从流中装载图像失败!"));
}
}
这些代码可以正常在控件中显示图片,在只要移动一个窗口(遮住显示图件的控件),则图片就不能正常重绘,看过网上很多代码,大多数是针对客户区在OnPaint中利用双缓冲技术画,然后在OnDraw中BitBlt一次,则不会出现闪烁,我也试了很久,但都没有成功,请教各位到底如何才能完美地在图像控件中动态显示图片(Jpg、Gif、Bmp),最好不要用其它的三方控件,谢谢!