UpdateLayeredWindow 在 Windows 7 中失败 GetLastError 87

问题描述

窗口创建代码:

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_,m_Height);
if (m_isHover)
{
    if (!m_hoverImage.IsNull())
        m_hoverImage.Draw(mem_dc_,m_Height);
}

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

在Win10下,显示正常:

alpha png

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

seem control bg

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)