GDI - 我可以在WM_PAINT调用之间将位图保存在内存中吗?

时间:2016-02-07 18:14:01

标签: c++ windows winforms bitmap gdi

我想优化我的窗口绘画。 想要在窗口中拥有静态内容和动态内容。 静态内容计算一次,并从创建的位图绘制。

我正在使用下一个算法:

  /* !global object! HBITMAP hStaticBitmap */ 
  PAINTSTRUCT ps = {};

  HDC  hdc = BeginPaint (hWnd, &ps);
  //-------------------------------------------
  HDC   hStaticDC = CreateCompatibleDC (hdc);

  if ( hStaticBitmapChanged )
  {
    /* Create once */
    if (hStaticBitmap)
      DeleteObject (hStaticBitmap);

    hStaticBitmap = CreateCompatibleBitmap (hdc, myRect.right  - myRect.left,
                                                 myRect.bottom - myRect.top);
    HBITMAP hBmp_old = (HBITMAP) SelectObject (hStaticDC, wd.hStaticBitmap);
    //-------------------------------------
    OnPaintStaticFigures (hStaticDC);
    hStaticBitmapChanged = false;
    //-------------------------------------
    SetStretchBltMode (hdc, COLORONCOLOR);
    BitBlt (hdc, 0, 0,
            myRect.right - myRect.left,
            myRect.bottom - myRect.top,
            hStaticDC, 0, 0,
            SRCCOPY);
    //-------------------------------------
    SelectObject (hStaticDC, hBmp_old);
  }
  else
  {
    /* Paint every time */
    HBITMAP  hBmp_old = (HBITMAP) SelectObject (hStaticDC, wd.hStaticBitmap);
    //-------------------------------------
    SetStretchBltMode (hdc, COLORONCOLOR);
    BitBlt (hdc, 0, 0,
            myRect.right - myRect.left,
            myRect.bottom - myRect.top,
            hStaticDC, 0, 0,
            SRCCOPY);
    //-------------------------------------
    SelectObject (hStaticDC, hBmp_old);
  }

  HDC   hCmpDC = CreateCompatibleDC (hdc);
  HBITMAP  hBmp = CreateCompatibleBitmap (hdc, myRect.right  - myRect.left,
                                               myRect.bottom - myRect.top);
  SelectObject (hCmpDC, hBmp);
  //-------------------------------------
  OnPainDynamicFigures (hCmpDC, wd);
  //-------------------------------------
  SetStretchBltMode (hdc, COLORONCOLOR);
  BitBlt (hdc, 0, 0,
          myRect.right  - myRect.left,
          myRect.bottom - myRect.top,
          hCmpDC, 0, 0,
          SRCCOPY);

  DeleteDC (hStaticDC);
  DeleteDC (hCmpDC);
  DeleteObject (hBmp);
  //---------------------------------------------
  EndPaint (hWnd, &ps);

问题是:删除hStaticDC后清除hStaticBitmap。 如何处理?

谢谢

修改

现在我不确定,因为hStaticDC会发生这种情况。我让hStaticDC成为全球性的。但我可以看到黑色背景,第二个位图擦除第一个位图。我尝试了另一种重叠模式,并使用全局hdc显示两个位图。

我想改变我的问题:如何使位图没有背景光?

1 个答案:

答案 0 :(得分:0)

工作变体:使用较低层作为上层的背景!

 /* !global object! HBITMAP hStaticBitmap */ 
 /* !global object! HBITMAP hStaticDC    */ // !!!global 

  PAINTSTRUCT ps = {};
  HDC  hdc = BeginPaint (hWnd, &ps);
  //-------------------------------------------
  if ( hStaticBitmapChanged )
  {
    /* Create once */
    if ( !hStaticDC )                       // !!!global 
      hStaticDC = CreateCompatibleDC (hdc);
    if (hStaticBitmap)
      DeleteObject (hStaticBitmap);

    hStaticBitmap = CreateCompatibleBitmap (hdc, myRect.right  - myRect.left,
                                                 myRect.bottom - myRect.top);
    SelectObject (hStaticDC, hStaticBitmap);
    //-------------------------------------
    OnPaintStaticFigures (hStaticDC);
    hStaticBitmapChanged = false;
    //-------------------------------------
  }

  HDC   hCmpDC = CreateCompatibleDC (hdc);
  HBITMAP  hBmp = CreateCompatibleBitmap (hdc, myRect.right  - myRect.left,
                                               myRect.bottom - myRect.top);
  SelectObject (hCmpDC, hBmp);
  //-------------------------------------
  /* Paint every time */
  SetStretchBltMode (hCmpDC, COLORONCOLOR);   // !!! hCmpDC
  BitBlt ( hCmpDC , 0, 0,                     // !!! hCmpDC
           myRect.right - myRect.left,
           myRect.bottom - myRect.top,
           hStaticDC, 0, 0,
           SRCCOPY);
  //-------------------------------------
  OnPainDynamicFigures (hCmpDC, wd);
  //-------------------------------------
  SetStretchBltMode (hdc, COLORONCOLOR);
  BitBlt (hdc, 0, 0,
          myRect.right  - myRect.left,
          myRect.bottom - myRect.top,
          hCmpDC, 0, 0,
          SRCCOPY);

  // DeleteDC (hStaticDC); /* later */
  // DeleteObject (hStaticBitmap); /* later */
  DeleteDC (hCmpDC);
  DeleteObject (hBmp);
  //---------------------------------------------
  EndPaint (hWnd, &ps);