首页 > 解决方案 > Windows 7 GetLastError 87 中的 UpdateLayeredWindow 失败

问题描述

窗口创建代码:

LPCTSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, AfxGetApp()->LoadStandardCursor(IDC_ARROW),
    (HBRUSH)GetStockObject(TRANSPARENT), NULL);

if(PngID)
    GdiplusHelper::LoadImageFromResource(m_bkImage, PngID, _T("PNG"));
if(HoverPngID)
    GdiplusHelper::LoadImageFromResource(m_hoverImage, HoverPngID, _T("PNG"));

m_Width = m_bkImage.GetWidth();
m_Height = m_bkImage.GetHeight();

BOOL ret = CWnd::Create(lpszClassName, NULL, WS_OVERLAPPED | WS_VISIBLE, CRect(x, y, x + m_Width, y + m_Height), pParentWnd, nID);
ADD_EX_STYLE(GetSafeHwnd(), WS_EX_LAYERED);

绘制代码:

BLENDFUNCTION pb_ = { 0 };
pb_.AlphaFormat = AC_SRC_ALPHA;
pb_.BlendOp = AC_SRC_OVER;
pb_.BlendFlags = 0;
pb_.SourceConstantAlpha = 255;

HDC dc = ::GetDC(GetSafeHwnd());
HDC mem_dc_ = CreateCompatibleDC(dc);
HBITMAP hBitmap = CreateCompatibleBitmap(dc, m_Width, m_Height);
CPoint  pt_(0, 0);
CSize   size_(m_Width, m_Height);
::SelectObject(mem_dc_, hBitmap);
if (!m_bkImage.IsNull())
    m_bkImage.Draw(mem_dc_, 0, 0, m_Width, m_Height);
if (m_isHover)
{
    if (!m_hoverImage.IsNull())
        m_hoverImage.Draw(mem_dc_, 0, 0, m_Width, m_Height);
}

if (!::UpdateLayeredWindow(GetSafeHwnd(), dc, nullptr, &size_, mem_dc_, &pt_, 0, &pb_, ULW_ALPHA))
{
    LOGE("UpdateLayeredWindow err:" << (int)GetLastError() );
    //BitBlt(dc, 0, 0, m_Width, m_Height, mem_dc_, 0, 0, SRCCOPY);
    goto cleanup;
}
cleanup:
if(mem_dc_)
    DeleteDC(mem_dc_);
if(hBitmap)
    DeleteObject(hBitmap);
if(dc)
    DeleteDC(dc);

Win10下显示正常:

阿尔法PNG

但是在Win7中,我得到GetLastError()=87

似乎控制bg

问题是该函数UpdateLayeredWindow()在Win7下不起作用,但我不知道为什么,我认为我没有使用错误的参数。

有谁知道发生这种情况的原因?

标签: c++windowsmfcgdi+

解决方案


推荐阅读