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

GDI - Can I save the bitmap in memory between WM_PAINT calls?

我想优化我的 window 绘画。 想要window中的静态内容和动态内容。 静态内容已计算一次,正在从创建的位图中绘制。

我正在使用下一个算法:

  /* !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);

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

谢谢


编辑:

现在我不确定它是否会发生,因为 hStaticDC。我已将 hStaticDC 设为全局。但我可以看到黑色背景,第二个位图擦除第一个位图。我尝试了另一种重叠模式,并且使用全局 hdc 显示了两个位图。

我想换个问题:如何让位图没有背景?

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

 /* !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);