繁体   English   中英

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

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

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

我正在使用下一个算法:

  /* !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显示了两个位图。

我想更改我的问题:如何制作没有背景色的位图?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM