双缓冲防图片刷新闪烁问题--内存泄漏4K

shawnwan 2007-06-11 12:55:49
使用双缓冲技术防止刷新时的闪烁问题:(会发生内存泄漏、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();
...全文
2037 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
benpao180 2012-02-19
  • 打赏
  • 举报
回复
如果你是在wince下面编程的话,当调用CDC::GetDC, 再CDC::ReleaseDC释放CDC的时候本来就有内存泄露,这是微软的问题。不过泄露每次只有4k,使用纯API来写::GetDC(HWND hWnd); ::ReleaseDC(HWND hWnd, HDC hDC);可以避免。
b2b160 2007-06-13
  • 打赏
  • 举报
回复
代码太长了.......

代码最基本要求是不要超过一屏.看着头晕.
xiaoqiangvs007 2007-06-13
  • 打赏
  • 举报
回复
1)用什么来检测出来的?
2)如想确定是否OnDrow(),可以写个简单函数代替。看看有没有泄漏就是了
charleswu82 2007-06-13
  • 打赏
  • 举报
回复
mark
Prince_vegeta 2007-06-13
  • 打赏
  • 举报
回复
LZ做个DEMO,让大家看看.
嗷嗷叫的老马 2007-06-12
  • 打赏
  • 举报
回复
........................................
qingfeng2010 2007-06-12
  • 打赏
  • 举报
回复
学习 MARK
三条猫 2007-06-12
  • 打赏
  • 举报
回复
另外你把OnDraw内的局部变量CDC MemDC; CBitmap MemBitmap;
改为类的成员变量,以免OnDraw调用过于频繁,无谓的构造析构
三条猫 2007-06-12
  • 打赏
  • 举报
回复
你可以不忙调用ONDRAW 和 SHOWJPGGIF,控件无显示,裸跑一下,看看有无内存泄漏.
  • 打赏
  • 举报
回复
同意楼上
shawnwan 2007-06-12
  • 打赏
  • 举报
回复
郁闷,问题依然存在啊,难道真的不是ONDRAW 和 SHOWJPGGIF的问题,,我做的是一个OCX控件,没有用到NEW和MALLOC啊。
lwb723 2007-06-12
  • 打赏
  • 举报
回复
mark :)
shawnwan 2007-06-12
  • 打赏
  • 举报
回复
我试下先
shawnwan 2007-06-12
  • 打赏
  • 举报
回复
怎样来?
LiveALearn(研究GDI)
请指教
三条猫 2007-06-12
  • 打赏
  • 举报
回复
CComQIPtr<IPicture> spIPicture;
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上
三条猫 2007-06-12
  • 打赏
  • 举报
回复
读取图片的时候,可以不使用GlobalAlloc,FreeResource,避免内存泄漏.

可以这样来:
Stefine 2007-06-12
  • 打赏
  • 举报
回复
用BC定位?
三条猫 2007-06-12
  • 打赏
  • 举报
回复
你是如何判断泄漏了4K内存:

调试状态结束时,输出窗口的显示?
用第三方软件查看?
直接看内存使用状况?
shawnwan 2007-06-12
  • 打赏
  • 举报
回复
WIN 2000 、WIN XP呢
三条猫 2007-06-12
  • 打赏
  • 举报
回复
在win98,wince下,双缓冲之后要这么释放:

MemDC.DeleteDC();//先删DC
MemBitmap.DeleteObject();//再删Bitmap
加载更多回复(21)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧