您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> VC/MFC >> 帮忙看看哪里不对

帮忙看看哪里不对

来源:网络整理     时间:2016/7/6 16:52:19     关键词:

关于网友提出的“ 帮忙看看哪里不对”问题疑问,本网通过在网上对“ 帮忙看看哪里不对”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 帮忙看看哪里不对
描述:


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

相关图片

相关文章