[英]transparency layered window white
我正在嘗試使用c ++ win32制作一個分層的窗口,但是它的圖形或“碰撞”存在問題
供參考,我試圖顯示的圖片。
這是窗口的基本創建
//window
DWORD exFlags = 0;
if(m_bTransparent)
exFlags |= WS_EX_LAYERED;
Create(WS_POPUP, exFlags);
std::wstring sPic(L"power-disconnected.png");
m_pAlertPic = m_pPowerMon->GetGPPicMan()->LoadPicture(sPic.c_str());
// make the window layered when using transparency
if(m_bTransparent && m_pAlertPic != nullptr)
{
HDC hdcScreen = GetDC(GetHandle());
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmpold = (HBITMAP)SelectObject(hdc, m_pAlertPic->GetBuffer());
POINT dcOffset = {0, 0};
SIZE size = {ww, wh};
BLENDFUNCTION bf = {AC_SRC_OVER, 0, (int) (2.55 * 100), AC_SRC_ALPHA}; // blend function combines opacity and pixel based transparency
UpdateLayeredWindow(GetHandle(), hdcScreen, NULL, &size, hdc, &dcOffset, RGB(255, 255, 255), &bf, ULW_ALPHA);
SelectObject(hdc, hbmpold);
DeleteDC(hdc);
ReleaseDC(GetHandle(), hdcScreen);
}
和消息循環
int WindowAlert::WndProc(Gnaq::WindowBase* pWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CLOSE:
Hide();
return 1;
case WM_PAINT:
// only draw when the widow is not transparent
// layered window redraw them self
if(!m_bTransparent)
m_pCanvas->Draw(m_pGraphics);
break;
case WM_LBUTTONUP:
pWnd->Hide();
m_bDismised = true;
break;
}
return DefWindowProcW(pWnd->GetHandle(), msg, wParam, lParam);
}
所以這就是我得到的結果 如您所見,使用這種方法時,我得到的白色邊框實際上應該是完全透明的,但是半透明的部分卻可以正常工作。
這是我嘗試過的給我帶來“有用”變化的方法。 首先,我只是嘗試添加ULW_COLORKEY標志以隱藏白色
UpdateLayeredWindow(GetHandle(), hdcScreen, NULL, &size, hdc, &dcOffset, RGB(255, 255, 255), &bf, ULW_ALPHA | ULW_COLORKEY);
結果。
因此,這將隱藏白色邊框,但也隱藏圖片中的所有白色。 我嘗試過的下一件事是結合使用SetLayeredWindowAttributes和UpdateLayeredWindow,而沒有ULW_COLORKEY標志
SetLayeredWindowAttributes(GetHandle(), 0xFFFFFF00, 255, LWA_COLORKEY);
同樣在窗口proc中啟用繪畫,就像這樣
case WM_PAINT:
m_pCanvas->Draw(m_pGraphics);
break;
這樣,我從視覺上得到我想要的東西
但是他的方法的問題在於,整個窗口是可以單擊的,而僅使用UpdateLayeredWindow,只有應該完全透明的部分才可以單擊。 我對最后一種方法也有一種感覺,那就是它是一種“ hack”而不是一種體面的方法。
所以我希望有人能告訴我我在做什么錯。
第一種方法是正確的。 錯誤出在位圖中,它沒有預乘alpha
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.