2

首先,我正在使用 C++ 开发 Win32。

我一直在尝试用一个应该保持 100% 不透明的子窗口来实现一个透明窗口。似乎子控件的不透明度不能比父控件更好(更低),如果我让父控件 100% 透明,那么我的子控件也继承了透明度。

我使用的代码 -

SetLayeredWindowAttributes(GetParent(parentWindowHwnd), 0, 0, LWA_COLORKEY, LWA_ALPHA); 

有什么帮助吗?

如果我对我的问题不是很清楚,也请回复。

4

3 回答 3

4

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.

于 2009-05-07T13:08:12.787 回答
1

我敢肯定你可以反过来做,即一个不透明的主窗口和一个透明的子窗口,所以反过来也可能是正确的。您是否尝试过取消设置窗口的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 页面也可能有所帮助。

于 2009-04-24T18:35:14.063 回答
0

您不能使子控件的透明度低于其父控件。这里通常的方法是给你的窗口一个不规则的形状:不是一个矩形。这比 alpha 透明度要老得多 - 想想一个时钟应用程序:如果你愿意,你可以让你的窗口变成圆形,即使在 Windows 95 上也是如此。
这可以使用 Windows API 函数来完成SetWindowRgn
一个简单的 (vb)示例 Google 结果

于 2009-05-07T13:34:25.580 回答