簡體   English   中英

分層窗口上的C ++ GDI +圖形圖像不起作用

[英]C++ GDI+ Drawing Image on layered window not working

因此,我在SO上找到了許多有關將圖像繪制到分層窗口的代碼示例,指南和答案。 我嘗試使用純HBITMAP S和WIC庫進行繪制,現在我要使用GDI +進行繪制(這要簡單得多,看似更容易使用,到目前為止,它已經解決了許多錯誤WIC代碼錯誤)。

我目前停留在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)

為了在繪圖操作中保留alpha信息,您必須基於內存支持的Bitmap對象而不是HDC來創建Graphics對象,當然,您的Bitmap必須采用帶有alpha通道的格式。

您將需要使用以下位圖構造函數: http : //msdn.microsoft.com/zh-cn/library/ms536315%28v=vs.85%29.aspx

只要跨度為0,一個指向您的DIB位的指針以及PixelFormat32bppPARGB。

然后使用Graphics :: FromImage創建Graphics對象。

我從未使用過UpdateLayeredWindow,因此無法驗證其正確的一面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM