在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标志,当主要点击时,假窗口是可点击的,但是!它没有回应任何东西!点击/阻力。无。
答案 0 :(得分:0)
听起来你只是为了拦截点击而覆盖另一个窗口?
无论如何,您需要处理窗口的WM_NCHITTEST
消息,以便让系统知道特定位置是透明的,在这种情况下您返回HTTRANSPARENT
:
在同一个线程中另一个窗口当前覆盖的窗口中(该消息将被发送到同一线程中的基础窗口,直到其中一个窗口返回不是HTTRANSPARENT的代码)。
答案 1 :(得分:0)
制作两个窗口,一个具有点击属性,另一个具有普通属性。
答案 2 :(得分:0)
在您要接受点击的区域中使用alpha 1而不是0。窗口仍然是完全不可见的,但alpha 1的区域将正常记录点击和鼠标移动。
请注意,要获得每像素alpha,您需要使用UpdateLayeredWindow
而不是SetLayeredWindowAttributes
。