积极答复者
双缓冲的释放

问题
-
一般地,使用双缓冲作图(WIN32应用程序):
/*
注释
POINT pBeg,pEnd;
HDC hdc,hdcMem;
HBITMAP hBitmap;
HWND hWnd;
static int a=1;
HPEN hPen=CreatePen(PS_SOLID,iW,rgbCurrent);
*/
switch (message)
{case WM_LBUTTONDOWN:
a*=-1;
pBeg.x=LOWORD(lParam);
pBeg.y=HIWORD(lParam);return 0;
case WM_MOUSEMOVE:
hdc=GetDC(hWnd);
hdcMem=CreateCompatibleDC(hdc);
hPen=CreatePen(PS_SOLID,iW,rgbCurrent);
pEnd.x=LOWORD(lParam);
pEnd.y=HIWORD(lParam);
SelectObject(hdcMem,hPen);
if(a==-1)
{
SetCursor(LoadCursor(NULL,IDC_CROSS));
if(UNDO>0)
hBitmap=Frame(UndoName[UNDO]);//这里hBitmap为自定义
SelectObject(hdc,hBitmap);
GetClientRect(hWnd,&rect);
Rectangle(hdcMem,0,0,cxClient,cyClient);
FillRect(hdcMem,&rect,CreateSolidBrush(RGB(255,255,255)));
hBitmap1=(HBITMAP)SelectObject(hdcMem,hBitmap);
Arc(hdcMem,pBeg.x,pBeg.y,pEnd.x,pEnd.y,
pBeg.x,pBeg.y,pBeg.x,pBeg.y);
BitBlt(hdc,0,0,cxClient,cyClient,hdcMem,0,0,SRCCOPY);
InvalidateRect(hWnd,NULL,TRUE);
SelectObject(hdcMem,hBitmap1);
}
DeleteDC(hdcMem);
DeleteObject(hBitmap1);
DeleteObject(hPen);
ReleaseDC(hWnd,hdc);return 0;
}
当按下右健移动鼠标时,发现SelectObject(hdcMem,hBitmap)使内存占用量急剧上升,可否实时释放hdcMem中的hBitmap,求解,不胜感激!!!!!!!!!!!
QQ:1327729940
程学武
- 已编辑 程学武 2012年7月4日 6:36
答案
-
您可以把一些不变的东西放到其他的地方去做初始化,比如代码中的CreateSolidBrush()创建画刷,LoadCursor()加载光标可以放到WM_CREATE/WM_INITDIALOG中。
另外您Debug下调试可以发现您DeleteObject(hPen);操作会失败,原因是您需要将原来的HPEN对象SelectObject(),这样才能删除,否则DeleteObject()失败。
Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
- 已建议为答案 Helen Zhao 2012年7月4日 6:50
- 取消建议作为答案 程学武 2012年7月4日 14:14
- 已标记为答案 程学武 2012年7月5日 14:34
全部回复
-
您可以把一些不变的东西放到其他的地方去做初始化,比如代码中的CreateSolidBrush()创建画刷,LoadCursor()加载光标可以放到WM_CREATE/WM_INITDIALOG中。
另外您Debug下调试可以发现您DeleteObject(hPen);操作会失败,原因是您需要将原来的HPEN对象SelectObject(),这样才能删除,否则DeleteObject()失败。
Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
- 已建议为答案 Helen Zhao 2012年7月4日 6:50
- 取消建议作为答案 程学武 2012年7月4日 14:14
- 已标记为答案 程学武 2012年7月5日 14:34
-
...
...
case WM_MOUSEMOVE:
b=1;
if(r==0)
{
switch(d)
{
case 1:
if(a==-1)
{
hdc=GetDC(hWnd);
hPen=CreatePen(PS_SOLID,iW,rgbCurrent);
SetCursor(LoadCursor(NULL,IDC_CROSS));
pEnd.x=LOWORD(lParam);
pEnd.y=HIWORD(lParam);
hBitmap=Frame(UndoName[UNDO]);
hdcMem=CreateCompatibleDC(NULL);
SelectObject(hdcMem,hPen);
SelectObject(hdcMem,hBitmap);
DeleteObject(hBitmap);
MoveToEx(hdcMem,pBeg.x,pBeg.y,NULL);
LineTo(hdcMem,pEnd.x,pEnd.y);
BitBlt(hdc,0,0,cxClient,cyClient,hdcMem,0,0,SRCCOPY);
SelectObject(hdcMem,hBitmap);
DeleteDC(hdcMem);
DeleteObject(hPen);
ReleaseDC(hWnd,hdc);
}
return 0;这样就可以了,好简单啊,老程序占用一下下降到1000K,真不知所谓的"双缓冲“到底是什么!!
程学武