2016-02-07 50 views
0

我想優化我的窗口繪畫。 想要在窗口中有靜態內容和動態內容。 靜態內容計算一次,並從創建的位圖繪製。GDI - 我可以在WM_PAINT調用之間將位圖保存在內存中嗎?

我用下一個算法:

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

的問題是:hStaticBitmap被刪除hStaticDC後清零。 如何處理?

謝謝


編輯:

現在我不知道,這是因爲在hStaticDC的。我已經使hStaticDC成爲全球性的。但是我可以看到黑色背景,第二個位圖擦除了第一個。我嘗試了另一種重疊模式,並且使用全局hdc顯示了兩個位圖。

我想改變我的問題:如何使一個位圖沒有backgraoud?

回答

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); 
相關問題