关于网友提出的“ 帮忙看看哪里不对”问题疑问,本网通过在网上对“ 帮忙看看哪里不对”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 帮忙看看哪里不对
描述:
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;
}
这个函数的作用是比对屏幕上和资源位图上的像素是否一致,目前还是能用,但是程序运行一段时间就会出现问题,
提示:内存不足,无法创建位图,大家帮忙看看是哪里写的不对,是内存泄漏还是其他什么原因,望指教 谢谢!
解决方案1: 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;
}
解决方案2: HBITMAP hOldbmp= SelectObject(comdc,bmp);
.....
selectObject(comdc,hOldbmp);
DeleteObject(bmp);
解决方案3: HGDIOBJ hOldbmp= SelectObject(comdc,bmp);
.....
selectObject(comdc,hOldbmp);
DeleteObject(bmp);
如果对象被占用时,DeleteObject实际上是删除不掉的,要重新将老的对象选择进去替换掉bmp对象。
解决方案4: if( GetPixel(comdc,j,i) != GetPixel(hdc,j+x,i+y))
return FALSE;
return后就不会释放了,楼上的才是正解
解决方案5: 先用工具检查一下内存泄露
解决方案6: 换个编译器版本试试,看看会不会是编译器本身的bug
解决方案7: 可以试试:
先释放HDC, DeleteDC(comdc);
然后再释放BMP, DeleteObject(bmp);
以上介绍了“ 帮忙看看哪里不对”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2343951.html