各位高手,我用了一个双缓存的方法来解决图片闪烁的问题,放在MoseMove当中,代码如下:
CDC * pDC = GetDlgItem(IDC_STATIC1)->GetDC();
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(pDC);
CRect rc;
m_picture.GetClientRect(&rc);
MemBitmap.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
MemBitmap.m_hObject = 
(HBITMAP)::LoadImage(NULL,"2.bmp", IMAGE_BITMAP,rc.right,rc.bottom,LR_LOADFROMFILE);
CBitmap * pOldBit = MemDC.SelectObject(&MemBitmap);
m_drawDots->DrawDots(&MemDC);
pDC->BitBlt(0,0,rc.right,rc.bottom,&MemDC,0,0,SRCCOPY);//      FreeHandle(MemBitmap);
DeleteObject(MemBitmap.m_hObject);
MemDC.SelectObject(pOldBit);
MemDC.DeleteDC();
MemBitmap.DeleteObject();
ReleaseDC(pDC);
// delete pOldBit;   //这个指针很奇怪,删了就出现错误
出的问题就是只要鼠标move,任务管理器中的核心内存疯长,5s就卡死了,但这个程序进程本身占的内存还是5M左右,程序本身并没有报内存泄露的问题,如果把上面的LoadImage整句注释掉就不会有这个问题,当然结果也不是我想要的,这里是每move一次,Load一次,全局Load一次不行,求助各位,LoadImage怎么来释放,用句柄释放的方法也不可以,我的释放方法为什么不行呢,谢谢各位大虾~

解决方案 »

  1.   

    pOldBit只是表示在使用SelectObject前的一个对象,用在最后还原DC的。你不需要删除它也不能删除它。
      

  2.   

    LoadImage的返回值用单独的HBITMAP变量来保存,CBitmap的m_hObject成员不要随便更改,你这里根本不需要用兼容位图。
    GDI资源应该先从DC中选出,然后再DeleteObject。
    不是自己用new分配的指针不要delete。
    ReleaseDC(pDC)应该改成GetDlgItem(IDC_STATIC1)->ReleaseDC(pDC)。
      

  3.   

    MemBitmap 使用了 CreateCompatibleBitmap 创建,但又替换了其句柄 m_hObject,之前创建的位图没有删除。
    //最好使用绝对路径载入图片。
    HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), szFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); //可以使用 MemDC.DrawState 位图。DeleteObject(hBitmap);
      

  4.   

    我和几位同学商量了一下,跟lwx300得到的结论差不多,就是我创建了一个兼容位图,但下面这句就又加载一幅图片到另外的区域,导致原来创建的位图没有任何的指针指向它,
    MemBitmap.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
    MemBitmap.m_hObject =
    (HBITMAP)::LoadImage(NULL,"2.bmp", IMAGE_BITMAP,rc.right,rc.bottom,LR_LOADFROMFILE);
    是不是这样,高手指点,那么具体的改动怎么操作,我现在还没有试验出好的方法,小弟谢谢各位