主要通过在ondraw中调用ShowJpg这个函数。。函数代码如下:
BOOL CBmpjpgView::ShowJpg(CDC* pDC, CString strPath, int x, int y)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb; if (file.Open(strPath,CFile::modeRead)&&
file.GetStatus(strPath,fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); //从堆中分配一定数目的字节
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
{
return false;
}
IPicture *pPic; if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,
TRUE,IID_IPicture,(LPVOID*)&pPic)))
{ OLE_XSIZE_HIMETRIC jpgWidth;
OLE_YSIZE_HIMETRIC jpgHeight;
pPic->get_Width(&jpgWidth);
pPic->get_Height(&jpgHeight);
double fX,fY;
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)jpgWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)jpgHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
CRect rect;
GetClientRect(&rect);
if (fX<rect.Width() && fY<rect.Height())
{
pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,jpgHeight,jpgWidth,-jpgHeight,NULL);
}
else
{
pPic->Render(*pDC,x,y,rect.Width(),rect.Height(),0,jpgHeight,jpgWidth,-jpgHeight,NULL);
}
}
return true;}现在的问题是我打开一张大的jpg图片没什么问题..关键我再打开一个小图片的话..会重叠在大图片上面..而且单独打开小图片时..空余的客户端背景也有点小问题..问题应该出现在背景擦除那里..但不知道该怎么操作了..
期待热心的朋友帮助解答下..非常感谢..
BOOL CBmpjpgView::ShowJpg(CDC* pDC, CString strPath, int x, int y)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb; if (file.Open(strPath,CFile::modeRead)&&
file.GetStatus(strPath,fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); //从堆中分配一定数目的字节
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
pvData = GlobalLock(hGlobal);
if (pvData != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
}
else
{
return false;
}
IPicture *pPic; if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,
TRUE,IID_IPicture,(LPVOID*)&pPic)))
{ OLE_XSIZE_HIMETRIC jpgWidth;
OLE_YSIZE_HIMETRIC jpgHeight;
pPic->get_Width(&jpgWidth);
pPic->get_Height(&jpgHeight);
double fX,fY;
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)jpgWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)jpgHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
CRect rect;
GetClientRect(&rect);
if (fX<rect.Width() && fY<rect.Height())
{
pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,jpgHeight,jpgWidth,-jpgHeight,NULL);
}
else
{
pPic->Render(*pDC,x,y,rect.Width(),rect.Height(),0,jpgHeight,jpgWidth,-jpgHeight,NULL);
}
}
return true;}现在的问题是我打开一张大的jpg图片没什么问题..关键我再打开一个小图片的话..会重叠在大图片上面..而且单独打开小图片时..空余的客户端背景也有点小问题..问题应该出现在背景擦除那里..但不知道该怎么操作了..
期待热心的朋友帮助解答下..非常感谢..
::FillRect(pDC->GetSafeHdc(),&rect,CBrush(RGB(255,255,255)));
倒是改变图片时不显示新的图片,改变图片之后调用View类里的Invalidate()函数就好了。
我是这么做的在OnDraw函数调用
ShowJpg(pDC,m_strJPGPath,0,0);
改变m_strJPGPath的值改变显示的图片
里面直接返回true;
就不回闪了
这个我也尝试过,图像是不闪了,但是显示图片的背景就会有莫名其妙的错误
以前用双缓冲做过bmp的。。但是对于jpg图片,有点不知道从那个函数着手使用双缓冲。。
继续关注。。同样感谢。。
Render方法需要传入个DC,然后在上面render:
pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,jpgHeight,jpgWidth,-jpgHeight,NULL);
它可不管你传入的是屏幕DC还是内存DC的,因此,你只要CreateCompatibleDC()然后SelectObject()一个和这个jpeg一样大的Compatible Bitmap,就可以替换这个
*pDC来调用pPic->Render()方法实现双缓冲(Render()到内存DC)..
最后当然就pDC->BitBlt(left,top,w,h,&memDC,0,0,SRCCOPY)来显示(假如需要显示)