C++ C++;GDI+;在分层窗口上绘制图像不工作

C++ C++;GDI+;在分层窗口上绘制图像不工作,c++,image,gdi+,layered-windows,ws-ex-layered,C++,Image,Gdi+,Layered Windows,Ws Ex Layered,所以我找到了很多关于在分层窗口中绘制图像的代码示例、指南和答案。我曾经尝试使用纯HBITMAPS和WIC libs来绘制,现在我开始使用GDI+来绘制(它更简单,似乎更易于使用,到目前为止,它已经解决了许多由错误的WIC代码引起的错误) 我目前被困在UpdateLayeredWindow上。不管我怎么做,我都不能让它工作。现在,它返回87,或者ERROR\u INVALID\u参数。问题是,哪一个是错误的?我被难住了!下面的代码似乎是解决方案,而不是UpdateLayeredWindow拒绝工作

所以我找到了很多关于在分层窗口中绘制图像的代码示例、指南和答案。我曾经尝试使用纯
HBITMAP
S和WIC libs来绘制,现在我开始使用GDI+来绘制(它更简单,似乎更易于使用,到目前为止,它已经解决了许多由错误的WIC代码引起的错误)

我目前被困在
UpdateLayeredWindow
上。不管我怎么做,我都不能让它工作。现在,它返回87,或者
ERROR\u INVALID\u参数
。问题是,哪一个是错误的?我被难住了!下面的代码似乎是解决方案,而不是
UpdateLayeredWindow
拒绝工作的事实

我做错了什么

UpdateLayeredWindow(_hwndWindow, _oGrphInf.canvasHDC,
            NULL, NULL, hdcMem, &ptLoc,
            RGB(0, 0, 0), &blend, ULW_ALPHA)
下面是设置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);
}
把我的头发拔出来!帮忙

EDIT:我刚刚决定重新编写对
UpdateLayeredWindow
函数的调用,这解决了不正确的参数问题。这是我想到的。然而,它仍然不起作用。我做错了什么

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

为了在绘图操作中保留alpha信息,必须使图形对象基于内存支持的位图对象,而不是HDC,当然,位图的格式需要使用alpha通道

您需要使用此位图构造函数:

只需给它一个0的步长,一个指向DIB位的指针,以及像素格式32bpppargb

然后使用Graphics::FromImage创建图形对象

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

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

此外,您可能应该在(0,0)处绘制图像,因为分层窗口的大小应该只足以显示图像。或者,更简单的是,完全跳过图形对象,并使用带有用户输入缓冲区的Bitmap::Lock将位图中的位复制到dib部分。