如何创建支持透明度并由WPF窗口托管的窗口(CreateWindowEx)?

How to create window(CreateWindowEx) which support transparency and hosted by WPF window?

提问人:qakmak 提问时间:11/1/2023 最后编辑:qakmak 更新时间:11/1/2023 访问量:42

问:

我正在尝试创建支持透明度的窗口,并将其放在.net4.5的WPF窗口中

我决定使用:,所以我扩展类并覆盖其中的方法:HwndHostHwndHostBuildWindowCore

protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
    _winHand = CreateWindowEx(WS_EX_LAYERED, "static", string.Empty, WS_POPUP | WS_VISIBLE, 0, 0, _width, _height, hwndParent.Handle, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
    // set it support transparent
    SetLayeredWindowAttributes(_windowHandle, 100, 0, 2);
 
    return new HandleRef(this, _winHand);
}

但最后它会抛出异常:托管 HWND 必须是指定父窗口的子窗口。

现在我处于死循环中,如果我想要一个透明窗口,它必须是样式,但如果我想将窗口放在 wpf 中,它必须是WS_POPUPHwndHostWS_Child

无论如何都有办法吗?

原因是窗口必须是透明窗口,因为我需要使用 SDL2 渲染一些包含 alpha 通道的 rgba 图像。但是如果我没有设置,窗口就无法将 Alpha 通道显示为透明度。

C# C++ WPF SDL-2

评论

0赞 Charlieface 11/1/2023
为什么需要这样做?WPF 已支持透明度。还有为什么需要自己创建窗口,为什么不能在创建窗口后直接调用呢?SetLayeredWindowAttributes
0赞 qakmak 11/1/2023
@Charlieface,WPF支持透明度,但我需要创建一个窗口来渲染图像(或更复杂的stuf),如果样式不SDL2SetLayeredWindowAttributesfalseWS_POPUP

答: 暂无答案