各位高手,我用了一个双缓存的方法来解决图片闪烁的问题,放在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怎么来释放,用句柄释放的方法也不可以,我的释放方法为什么不行呢,谢谢各位大虾~
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怎么来释放,用句柄释放的方法也不可以,我的释放方法为什么不行呢,谢谢各位大虾~
GDI资源应该先从DC中选出,然后再DeleteObject。
不是自己用new分配的指针不要delete。
ReleaseDC(pDC)应该改成GetDlgItem(IDC_STATIC1)->ReleaseDC(pDC)。
//最好使用绝对路径载入图片。
HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), szFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); //可以使用 MemDC.DrawState 位图。DeleteObject(hBitmap);
MemBitmap.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
MemBitmap.m_hObject =
(HBITMAP)::LoadImage(NULL,"2.bmp", IMAGE_BITMAP,rc.right,rc.bottom,LR_LOADFROMFILE);
是不是这样,高手指点,那么具体的改动怎么操作,我现在还没有试验出好的方法,小弟谢谢各位