【问题标题】:How to create a transparent window with non-transparent child controls (or child windows)?如何使用不透明的子控件(或子窗口)创建透明窗口?
【发布时间】:2010-10-21 14:00:01
【问题描述】:

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

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

我使用的代码 -

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

有什么帮助吗?

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

【问题讨论】:

    标签: windows winapi window transparent


    【解决方案1】:

    不幸的是,您不能这样做,子窗口始终具有与其父窗口相同的不透明度。 Google 桌面工具栏有一个巧妙的技巧,可以在半透明背景上产生不透明文本框的错觉。他们创建了两个顶级窗口,一个用于背景,一个用于文本框。然后他们将背景窗口设置为 texbox 的所有者(而不是 )。然后他们将背景设置为透明。要做到这一点需要做很多工作,但这是在不使用 UpdateLayeredWindow 自己渲染整个事物的情况下做到这一点的唯一方法。

    【讨论】:

    • 小问题:如何将背景窗口设置为texbox的所有者?
    • 只是为了更新,从 Windows 8 开始,这不再是真的了。现在孩子可以分层了。
    【解决方案2】:

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

    【讨论】:

    • @ManojAwasthi:如果它没有解决您的问题,请不要接受它作为答案。
    • 是的。早期的时候我还不够了解。谢谢。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-24
      • 2013-02-21
      • 1970-01-01
      • 2020-09-12
      • 2016-03-03
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多