SetLayeredWindowAttributes 和 WS_CHILD

问题描述 投票:0回答:3

对于使用 WS_CHILD 样式创建的窗口,如何获得与 SetLayeredWindowAttributes 相同的效果?有什么解决方法吗?来自 MSDN:

创建分层窗口,在调用CreateWindowEx函数时指定WS_EX_LAYERED扩展窗口样式,或在创建窗口后调用SetWindowLong函数设置WS_EX_LAYERED。在调用 CreateWindowEx 之后,分层窗口将不可见,直到为此窗口调用了 SetLayeredWindowAttributes 或 UpdateLayeredWindow 函数。请注意,WS_EX_LAYERED 不能用于子窗口。

windows visual-c++ mfc
3个回答
2
投票

子窗口不能分层-该样式只对具有 WS_POPUP 样式的窗口有效。解决此问题的一种可能方法(不太优雅)是创建一个具有 WS_POPUP 样式的窗口,并在移动“父”窗口时同步其位置。


2
投票

在你设置孩子的透明之前:

首先设置它的MDI Main window (

SetWindowLong
&
SetLayeredWindowAttributes
),
然后它将直接为孩子工作。


0
投票

您可以在您的 Visual Studio 解决方案中添加一个.manifest 文件,但这只支持 Win8.1 及更高版本。

您可以将以下内容保存到 WindowLayer.manifest 中,并包含在您的项目中,再次构建,使用 WS_EX_LAYERED 和 WS_CHILD 的 CreateWindowEx 将可以工作,我测试了这个,它在我的 win10 计算机上工作。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application>
        <!--The ID below indicates application support for Windows Developer Preview -->
        <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
    </application>
  </compatibility>
  <dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
  </dependency>
</assembly>
© www.soinside.com 2019 - 2024. All rights reserved.