none
双缓冲的释放 RRS feed

  • 问题

  • 一般地,使用双缓冲作图(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月2日 12:26

答案

  • 可以阿 tmp = SelectObject(hdc,hBitmap); 先把选出来的句柄保存然后在删除的时候需要把原来的放回去 SelectObject(hdc, tmp); 这样才能删除hBitmap MSDN上写的很清楚

    0xDEADBEEF

    • 已建议为答案 Helen Zhao 2012年7月4日 6:50
    • 取消建议作为答案 程学武 2012年7月4日 14:14
    • 已标记为答案 程学武 2012年7月5日 14:34
    2012年7月3日 16:47
    版主
  • 您可以把一些不变的东西放到其他的地方去做初始化,比如代码中的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
    2012年7月3日 22:29
    版主

全部回复

  • 可以阿 tmp = SelectObject(hdc,hBitmap); 先把选出来的句柄保存然后在删除的时候需要把原来的放回去 SelectObject(hdc, tmp); 这样才能删除hBitmap MSDN上写的很清楚

    0xDEADBEEF

    • 已建议为答案 Helen Zhao 2012年7月4日 6:50
    • 取消建议作为答案 程学武 2012年7月4日 14:14
    • 已标记为答案 程学武 2012年7月5日 14:34
    2012年7月3日 16:47
    版主
  • 您可以把一些不变的东西放到其他的地方去做初始化,比如代码中的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
    2012年7月3日 22:29
    版主
  • 谢谢~~~

    程学武

    2012年7月4日 6:33
  • OK,我先试试

    程学武

    2012年7月4日 6:33
  • ...

    ...

    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,真不知所谓的"双缓冲“到底是什么!!


    程学武

    2012年7月5日 14:35
  • 完全正确,谢谢!!

    程学武

    2012年7月5日 14:36
  • 完全正确,谢谢!!

    程学武

    2012年7月5日 14:36