因此,我在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/en-us/library/ms536315%28v=vs.85%29.aspx

只要跨度为0,一个指向您的DIB位的指针以及PixelFormat32bppPARGB。

然后使用Graphics :: FromImage创建Graphics对象。

我从未使用过UpdateLayeredWindow,因此无法验证其正确的一面。

关于c++ - 分层窗口上的C++ GDI +图形图像不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11573349/

10-11 04:21