部分点击分层Windows Win32

partially click through on layered windows win32

本文关键字:Windows Win32 分层      更新时间:2023-10-16

在win32或atl/wtl c ++中使用分层窗口时,如果我将主窗口的alpha设置为0并在子窗口上绘画,假窗口以便可查看并单击窗口,则整个窗口都是点击通过的。我希望能够只点击窗口的区域,而不是整个窗口,假设我想画一个圆角窗口,我让底部/主窗口被点击,但我不希望上面的"假"窗口被点击通过,我希望能够点击它。我该怎么做?到目前为止,我所处的位置:在主窗口的 OnInitDialog 函数中:

::SetWindowLong( m_hWnd, GWL_EXSTYLE, ::GetWindowLong(m_hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
BYTE bTran = 0;
::SetLayeredWindowAttributes( m_hWnd, 0, bTran, LWA_ALPHA);

当我创建假窗口时:

m_hFakeWnd = ::CreateWindowEx( WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE | WS_EX_LEFT
        , m_strWndClassName
        , NULL
        , WS_VISIBLE | WS_OVERLAPPED
        , rc.left
        , rc.top
        , rc.Width()
        , rc.Height()
        , GetSafeHwnd()
        , NULL
        , ::GetModuleHandle(NULL)
        , NULL
        );

如果,我设置了消除WS_EX_TRANSPARENT标志,假窗口是可点击的,而主要窗口是点击通过的,但是! 它不响应任何东西! 点击/拖动。 没有。

听起来

您只是为了拦截点击而覆盖另一个窗口?

无论如何,您需要处理窗口的WM_NCHITTEST消息,以便能够让系统知道特定位置是透明的,在这种情况下,您返回HTTRANSPARENT

在同一线程中

当前由另一个窗口覆盖的窗口中(消息将发送到同一线程中的基础窗口,直到其中一个窗口返回非 HTTRANSPARENT 的代码)。

在要接受点击的区域中使用 alpha 1 而不是 0。窗口仍然完全不可见,但 alpha 1 的区域将正常记录点击和鼠标移动。

请注意,要获得每像素的 alpha,您需要使用 UpdateLayeredWindow 而不是 SetLayeredWindowAttributes

创建两个窗口,一个具有点击属性,另一个具有普通属性。