各位大侠:
我做了一个在Picture控件中显示图片的小例子,我的工程是基于对话框的,图片显示也是正常的,但是我移动对话框图片就会一闪一闪的,可能是在动态加载,这个虽然不爽但是还是可以接受,但是对话框中的两个按钮却因为图片的动态加载而显示不出来了,只有到按钮的位置去点击一下才会出现。我改怎么解决这个问题,我只要达到当对话框移动时按钮不消失,至于图片的一闪一闪能解决最好。谢谢
下面是我在Paint中的图片显示代码: CWnd *pWnd = GetDlgItem(IDC_PIC1);
CRect rect;
pWnd->GetClientRect(&rect);
CDC *pDC = pWnd->GetDC();
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
IPicture *pPic;
CString m_sPath = "F:\\Sunset.jpg";
if (file.Open(m_sPath,CFile::modeRead)&&file.GetStatus(m_sPath,fstatus)&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(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);
// double fX,fY;
// fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
// fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
// if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX/2,(DWORD)fY/2,0,hmHeight,hmWidth,-hmHeight,NULL)))
if(FAILED(pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("渲染图像失败!");
pPic->Release();
}
else
AfxMessageBox("从流中装载图像失败!");
我做了一个在Picture控件中显示图片的小例子,我的工程是基于对话框的,图片显示也是正常的,但是我移动对话框图片就会一闪一闪的,可能是在动态加载,这个虽然不爽但是还是可以接受,但是对话框中的两个按钮却因为图片的动态加载而显示不出来了,只有到按钮的位置去点击一下才会出现。我改怎么解决这个问题,我只要达到当对话框移动时按钮不消失,至于图片的一闪一闪能解决最好。谢谢
下面是我在Paint中的图片显示代码: CWnd *pWnd = GetDlgItem(IDC_PIC1);
CRect rect;
pWnd->GetClientRect(&rect);
CDC *pDC = pWnd->GetDC();
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
IPicture *pPic;
CString m_sPath = "F:\\Sunset.jpg";
if (file.Open(m_sPath,CFile::modeRead)&&file.GetStatus(m_sPath,fstatus)&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(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);
// double fX,fY;
// fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
// fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
// if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX/2,(DWORD)fY/2,0,hmHeight,hmWidth,-hmHeight,NULL)))
if(FAILED(pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("渲染图像失败!");
pPic->Release();
}
else
AfxMessageBox("从流中装载图像失败!");
dc.CreateCompatibleDC( &dco );
CBitmap bitmap;
bitmap.CreateCompatibleBitmap( &dco, rectTmp.Width(), rectTmp.Height() );
CBitmap *pOldBitmap = dc.SelectObject( &bitmap );.... // 你加载图片,画图等都在这里对dc进行操作 dco.BitBlt( 0, 0, iWidth, iHeight,
&dc, 0, 0, SRCCOPY );
dc.DeleteDC();
bitmap.DeleteObject();这样就不会闪烁了