【问题标题】:C++ GDI+ Drawing Image on layered window not working分层窗口上的C ++ GDI +绘图图像不起作用
【发布时间】:2012-07-20 05:24:39
【问题描述】:

所以我在 SO 上找到了很多关于将图像绘制到分层窗口的代码示例、指南和答案。我尝试使用纯HBITMAPS 和 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)

【问题讨论】:

    标签: c++ image gdi+ layered-windows ws-ex-layered


    【解决方案1】:

    要在绘图操作中保留 alpha 信息,您必须使您的 Graphics 对象基于内存支持的 Bitmap 对象,而不是 HDC,当然您的 Bitmap 需要采用具有 alpha 通道的格式。

    您需要使用此位图构造函数:http://msdn.microsoft.com/en-us/library/ms536315%28v=vs.85%29.aspx

    只需将步幅设为 0、指向 DIB 位的指针和 PixelFormat32bppPARGB。

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

    我从未使用过 UpdateLayeredWindow,所以我无法验证它的那一面是否正确。

    【讨论】:

    • 另外,您可能应该在 (0,0) 处绘制图像,因为您的分层窗口应该只大到足以显示您的图像。或者,更简单的是,完全跳过 Graphics 对象并使用 Bitmap::Lock 和用户输入缓冲区将位从 Bitmap 复制到 dib 部分。
    猜你喜欢
    • 2020-09-12
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2019-11-03
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多