帮忙看看哪里不对

wwsyxy 2011-09-26 10:24:55

BOOL BitCompare(DWORD dwBitmapId, int x, int y, int w, int h)
{
HDC hdc = GetWindowDC(NULL);//桌面DC
HDC comdc = CreateCompatibleDC(hdc);
HBITMAP bmp = LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(dwBitmapId));
SelectObject(comdc,bmp);
for (LONG i = 0 ; i < h ; i++)
{
for (LONG j = 0 ; j < w ; j++)
{
if( GetPixel(comdc,j,i) != GetPixel(hdc,j+x,i+y))
return FALSE;
}
}
DeleteObject(bmp);
DeleteDC(comdc);
ReleaseDC(NULL,hdc);
return TRUE;
}


这个函数的作用是比对屏幕上和资源位图上的像素是否一致,目前还是能用,但是程序运行一段时间就会出现问题,
提示:内存不足,无法创建位图,大家帮忙看看是哪里写的不对,是内存泄漏还是其他什么原因,望指教 谢谢!
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyh12345 2011-09-27
  • 打赏
  • 举报
回复
先用工具检查一下内存泄露
寻_风 2011-09-27
  • 打赏
  • 举报
回复
HGDIOBJ hOldbmp= SelectObject(comdc,bmp);

.....
selectObject(comdc,hOldbmp);
DeleteObject(bmp);

如果对象被占用时,DeleteObject实际上是删除不掉的,要重新将老的对象选择进去替换掉bmp对象。
wwsyxy 2011-09-27
  • 打赏
  • 举报
回复
好的!多谢
dahaiI0 2011-09-27
  • 打赏
  • 举报
回复
if( GetPixel(comdc,j,i) != GetPixel(hdc,j+x,i+y))
return FALSE;
return后就不会释放了,楼上的才是正解
TearyWang 2011-09-27
  • 打赏
  • 举报
回复
BOOL BitCompare(DWORD dwBitmapId, int x, int y, int w, int h)
{
BOOL bResult = TRUE;

HDC hdc = GetWindowDC(NULL);//桌面DC
HDC comdc = CreateCompatibleDC(hdc);
HBITMAP bmp = LoadBitmap(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(dwBitmapId));
SelectObject(comdc,bmp);
for (LONG i = 0 ; i < h && bResult ; i++)
{
for (LONG j = 0 ; j < w ; j++)
{
if( GetPixel(comdc,j,i) != GetPixel(hdc,j+x,i+y))
{
bResult = FALSE;
break;
}
}
}
DeleteObject(bmp);
DeleteDC(comdc);
ReleaseDC(NULL,hdc);


return bResult;
}
李_军 2011-09-27
  • 打赏
  • 举报
回复
HBITMAP hOldbmp= SelectObject(comdc,bmp);

.....
selectObject(comdc,hOldbmp);
DeleteObject(bmp);

dahaiI0 2011-09-26
  • 打赏
  • 举报
回复
SelectObject(comdc,bmp);
把位图选进DC后要保存原位图,然后selectobject回去,这么做不会错,不做有可能会错,MSDN:
Do not delete a drawing object (pen or brush) while it is still selected into a device context.
柯本 2011-09-26
  • 打赏
  • 举报
回复
换个编译器版本试试,看看会不会是编译器本身的bug
wwsyxy 2011-09-26
  • 打赏
  • 举报
回复
嗯,我试试
罗平 2011-09-26
  • 打赏
  • 举报
回复
可以试试:
先释放HDC, DeleteDC(comdc);
然后再释放BMP, DeleteObject(bmp);

15,979

社区成员

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

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