2012-07-20 66 views
0

所以我發現了很多關於將圖像繪製到分層窗口的代碼示例,指南和答案。我嘗試過使用純HBITMAP S和WIC庫進行繪製,現在我正在使用GDI +進行繪製(這非常簡單並且看起來更容易使用,並且迄今爲止它已解決了許多導致的錯誤由錯誤的WIC代碼)。C++ GDI +圖層分層窗口上的圖像無法正常工作

我目前卡在UpdateLayeredWindow。無論我嘗試什麼,我都無法讓它工作。現在,它返回87或ERROR_INVALID_PARAMETER。問題是,哪一個不正確?我很難過!下面的代碼似乎是解決方案,而不是UpdateLayeredWindow拒絕工作的事實。

我在做什麼錯?

下面是設置HDC /位圖信息/圖形對象的代碼。

// Create DC 
_oGrphInf.canvasHDC = GetDC(_hwndWindow); 

// Create drawing 'canvas' 
_oGrphInf.lpBits = NULL; 
_oGrphInf.bmpCanvas = CreateDIBSection(_oGrphInf.canvasHDC, 
      &_oGrphInf.bmpWinInformation, DIB_RGB_COLORS, 
      &_oGrphInf.lpBits, NULL, 0); 

// Create graphics object 
_oGrphInf.graphics = new Gdiplus::Graphics(_oGrphInf.canvasHDC); 

上述工作正常 - 我一步一步通過它,所有的指針工作。

這裏是繪製PNG的方法。

void Splash::DrawPNG(PNG* lpPNG, int x, int y) 
{ 
    LOGD("Drawing bitmap!"); 

    HDC hdcMem = CreateCompatibleDC(_oGrphInf.canvasHDC); 

    // Select 
    HBITMAP bmpOld = (HBITMAP)SelectObject(hdcMem, _oGrphInf.bmpCanvas); 

    Gdiplus::Color trans(0, 0, 0, 0); 
    _oGrphInf.graphics->Clear(trans); 

    _oGrphInf.graphics->DrawImage(lpPNG->GetImage(), x, y); 

    _oGrphInf.graphics->Flush(); 

    SIZE szSize = {_oGrphInf.bmpWinInformation.bmiHeader.biWidth, 
        _oGrphInf.bmpWinInformation.bmiHeader.biHeight}; 

    // Setup drawing location 
    POINT ptLoc = {0, 0}; 
    POINT ptSrc = {0, 0}; 

    // Set up alpha blending 
    BLENDFUNCTION blend = {0}; 
    blend.BlendOp = AC_SRC_OVER; 
    blend.SourceConstantAlpha = 255; 
    blend.AlphaFormat = AC_SRC_ALPHA; 
    blend.BlendFlags = 0; 

    // Update 
    if(UpdateLayeredWindow(_hwndWindow, _oGrphInf.canvasHDC, &ptLoc, 
           &szSize, hdcMem, &ptSrc, 
           (COLORREF)RGB(0, 0, 0), 
           &blend, ULW_ALPHA) == FALSE) 
     LOGE("Could not update layered window: %u", GetLastError()); 

    // Delete temp objects 
    SelectObject(hdcMem, bmpOld); 
    DeleteObject(hdcMem); 
    DeleteDC(hdcMem); 
} 

把我的頭髮拉出來!幫幫我?

編輯:我只是決定重新編寫UpdateLayeredWindow函數的調用,它解決了不正確的參數問題。這是我想出來的。 但是,它仍然不起作用。我究竟做錯了什麼?

UpdateLayeredWindow(_hwndWindow, _oGrphInf.canvasHDC, 
      NULL, NULL, hdcMem, &ptLoc, 
      RGB(0, 0, 0), &blend, ULW_ALPHA) 

回答

1

對於在繪製操作被保留alpha信息,你必須讓你的顯卡基於對象的存儲支持位圖對象,而不是一個HDC上,當然你的位圖需要在格式與alpha通道。

你需要使用此位圖構造函數:http://msdn.microsoft.com/en-us/library/ms536315%28v=vs.85%29.aspx

只要給的,使得0一大步,一個指向您的DIB的位,PixelFormat32bppPARGB。

然後使用Graphics :: FromImage創建您的Graphics對象。

我從來沒有使用過UpdateLayeredWindow,所以我無法驗證它的那一面是正確的。

+0

此外,您可能應該在(0,0)處繪製圖像,因爲您的分層窗口應該足夠大才能顯示圖像。或者,更簡單的方法是完全跳過Graphics對象,並使用帶有用戶輸入緩衝區的Bitmap :: Lock將Bitmap中的位複製到dib部分。 – 2012-07-21 05:27:22