首先,我正在使用 C++ 开发 Win32。
我一直在尝试用一个应该保持 100% 不透明的子窗口来实现一个透明窗口。似乎子控件的不透明度不能比父控件更好(更低),如果我让父控件 100% 透明,那么我的子控件也继承了透明度。
我使用的代码 -
SetLayeredWindowAttributes(GetParent(parentWindowHwnd), 0, 0, LWA_COLORKEY, LWA_ALPHA);
有什么帮助吗?
如果我对我的问题不是很清楚,也请回复。
首先,我正在使用 C++ 开发 Win32。
我一直在尝试用一个应该保持 100% 不透明的子窗口来实现一个透明窗口。似乎子控件的不透明度不能比父控件更好(更低),如果我让父控件 100% 透明,那么我的子控件也继承了透明度。
我使用的代码 -
SetLayeredWindowAttributes(GetParent(parentWindowHwnd), 0, 0, LWA_COLORKEY, LWA_ALPHA);
有什么帮助吗?
如果我对我的问题不是很清楚,也请回复。
You can't do this unfortunately, child windows always have the same opacity as their parent. The Google Desktop Toolbar had a neat trick to give the illusion of an opaque textbox on a translucent background. They created two top level windows, one of the background and one for the textbox. Then they set the background window as the owner (not the parent) of the texbox. They then set the background as transparent. It's quite a bit of work to get right, but it's the only way to do it without rendering the whole thing yourself using UpdateLayeredWindow.
我敢肯定你可以反过来做,即一个不透明的主窗口和一个透明的子窗口,所以反过来也可能是正确的。您是否尝试过取消设置子窗口的WS_EX_LAYERED
标志,然后重新绘制它以使其再次完全不透明?
// Remove WS_EX_LAYERED from the window styles
SetWindowLong(hChildWnd,
GWL_EXSTYLE,
GetWindowLong(hChildWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED);
RedrawWindow(hChildWnd,
NULL,
NULL,
RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
Layered Windows上的 MSDN 页面也可能有所帮助。