问题描述
窗口创建代码:
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下,显示正常:
但在 Win7 中,我得到 GetLastError()=87
:
问题是函数UpdateLayeredWindow()
在Win7下不起作用,但不知道为什么,我认为我没有使用错误的参数。
有人知道发生这种情况的原因吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)