1

在 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 标志,假窗口是可点击的,而主要是点击,但是!它不响应任何东西!单击/拖动。没有任何。

4

3 回答 3

1

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

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

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

于 2012-11-20T14:24:09.783 回答
0

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

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

于 2012-11-20T19:26:40.777 回答
0

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

于 2012-11-20T15:32:45.220 回答