使用双缓冲技术防止刷新时的闪烁问题:(会发生内存泄漏、4K)
OnDraw函数代码:
CRect rect;
GetClientRect(rect);
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pdc,rect.Width(),rect.Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,rcBounds.Width(),rcBounds.Height(),RGB(255,255,255));
//画图
pdc->BitBlt(0,0,rcBounds.Width(),rcBounds.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
OnDraw函数代码:
CRect rect;
GetClientRect(rect);
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
MemBitmap.CreateCompatibleBitmap(pdc,rect.Width(),rect.Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,rcBounds.Width(),rcBounds.Height(),RGB(255,255,255));
//画图
pdc->BitBlt(0,0,rcBounds.Width(),rcBounds.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
解决方案 »
- VS2010下用TeeChart控件的问题
- 如何让对话框半透明,而此对话框上面的控件不透明
- 如何传递参数到一个可执行程序中?
- 我在第二书店买书的遭遇(留言有分:我目前的分数9939)
- 各位高手,很急的问题。
- VC里函数前的“RESULT WINAPI”是什么意思,什么书上有讲?
- 请问在用vc中的CEditView打开一个文本文件的时候,可能使用到那些类!
- GetClientRect一问
- 求人做毕业设计中的一个模块,给钱也行
- 求一段基于MFC高通滤波器程序,主要是想实现滤除波形的基线漂移
- vc求救(DEV_BROADCAST_DEVICEINTERFACE)
- MSDN 最新精简版、绿色版,绝好的东西,强烈推荐,不顶勿进!
ShowJpgGif(CDC* pDC, CString strPath, int x, int y, bool showflag)
{
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);
file.Close();
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
IPicture *pPic;
//load image from file stream
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;
//get image height and width
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);
//use render function display image
if(FAILED(pPic->Render(*pDC,x,y,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
{
pPic->Release();
pPic=NULL;
pStm->Release();
pStm=NULL;
FreeResource(hGlobal);
return false;
}
pPic->Release();
pPic=NULL;
pStm->Release();
pStm=NULL;
FreeResource(hGlobal);
}
else
{
pPic->Release();
pPic=NULL;
pStm->Release();
pStm=NULL;
FreeResource(hGlobal);
}
}
}
}
else
{
try
{
file.Close();
}
catch (...)
{
}
CString strout;
strout.Format("ÕÒ²»µ½Í¼Æ¬Îļþ: %s",strPath);
AfxMessageBox(strout);
return false;
} //´ò¿ªÎļþ½áÊø
return true;
}
MemBitmap.CreateCompatibleBitmap(&MemDC,rect.Width(),rect.Height());
MemBitmap.CreateCompatibleBitmap(&MemDC,rect.Width(),rect.Height());不能写成MEMDC
个人觉得检查溢出最简单的方法就是排除法.
void CEightLightCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
// TODO: Replace the following code with your own drawing code.
CRect rect;
GetClientRect(rect); CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(pdc);//NULL);
MemBitmap.CreateCompatibleBitmap(pdc,rect.Width(),rect.Height());
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
MemDC.FillSolidRect(0,0,rcBounds.Width(),rcBounds.Height(),RGB(255,255,255));
pdc->BitBlt(0,0,rcBounds.Width(),rcBounds.Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
依然会发生泄漏,问题就应该出在这里,
另外大致明白了一个问题,之所以为4K的增长显示,是因为分配内存的页面大小最少为4K"你该不会是从任务管理器里面发现内存使用量上升了4K,就认为是有4K的泄露把?PS:你裤衩比我多,相信不太可能是这样,我也只是做个猜测!!!如果不是这样,就当是我帮你顶了!
顶下!
MemBitmap.DeleteObject();//再删Bitmap
CFile file;
if (file.Open(pszPathName, CFile::modeRead | CFile::shareDenyWrite))
{
CArchive ar(&file, CArchive::load | CArchive::bNoFlushOnDelete); CArchiveStream arStream(&ar); HRESULT hr = OleLoadPicture((IStream*)&arStream, 0, FALSE, IID_IPicture, (void**)&spIPicture);
ASSERT(SUCCEEDED(hr) && spIPicture);
}一样是可以读取JPG和GIF的第一帧图像.
之后使用spIPicture的Render函数把图像读取到双缓冲DC上
LiveALearn(研究GDI)
请指教
改为类的成员变量,以免OnDraw调用过于频繁,无谓的构造析构
2)如想确定是否OnDrow(),可以写个简单函数代替。看看有没有泄漏就是了