C++ GDI +图层分层窗口上的图像无法正常工作

问题描述:

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

对于在绘制操作被保留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