【问题标题】:WS_EX_LAYERED with SetParent() doesn't show the window带有 SetParent() 的 WS_EX_LAYERED 不显示窗口
【发布时间】:2021-12-15 21:31:49
【问题描述】:

我有一个我无法解决的问题。我正在尝试从我的应用程序中创建一个透明的窗口(使用标志WS_EX_TRANSPARENT | WS_EX_LAYERED)到另一个不透明的窗口的子窗口。

当我不使用带有 WS_EX_LAYERED 标志的 my_window 调用 SetParent( my_window, target_parent_window ) 时,新的子窗口将不可见。

我发现清单条目可以帮助我,因为从 Windows 8 开始支持带有标志 WS_EX_LAYERED 的子窗口。我尝试过但没有成功。

::SetWindowLongW( process_window, GWL_STYLE, WS_CLIPSIBLINGS | WS_POPUP | WS_VISIBLE );
::SetWindowLongW( process_window, GWL_EXSTYLE, WS_EX_TRANSPARENT | WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW );

::SetWindowPos( process_window, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
::ShowWindow( process_window, SW_SHOW );

::SetParent( process_window, new_parent_window); // if i skip this call the window will render perfectly

【问题讨论】:

  • 参考documentation“出于兼容性原因,SetParent 不会修改其父级正在更改的窗口的 WS_CHILD 或 WS_POPUP 窗口样式。”
  • 父窗口是否与子窗口在同一个进程中

标签: c++ windows winapi


【解决方案1】:

https://docs.microsoft.com/en-us/windows/win32/winmsg/window-features

要创建分层窗口,在调用CreateWindowEx函数时指定WS_EX_LAYERED扩展窗口样式,或在窗口创建后调用SetWindowLong函数设置WS_EX_LAYERED。在CreateWindowEx 调用之后,分层窗口将不可见,直到为此窗口调用了SetLayeredWindowAttributesUpdateLayeredWindow 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多