部分点击分层窗口win32

时间:2012-11-20 09:43:52

标签: c++ winapi atl wtl

在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标志,当主要点击时,假窗口是可点击的,但是!它没有回应任何东西!点击/阻力。无。

3 个答案:

答案 0 :(得分:0)

听起来你只是为了拦截点击而覆盖另一个窗口?

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

  

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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