尽管WS_EX_NOACTIVATE如何停止事件传播?

时间:2013-06-11 17:31:34

标签: windows delphi winapi

我有一个半透明的形式(使用AlphaBlend)作为叠加层。为了让用户仍然可以与下面的窗口进行交互,我在表单上设置了WS_EX_NOACTIVATE,所以右键和左键单击都会转到另一个窗口。

但是我的表单上有一些可点击的标签。单击这些并执行相应的操作可以正常工作,因为尽管WS_EX_NOACTIVATE标志调用了OnClick方法,但点击将(显然)也传播到另一个窗口,在这种情况下我不想要。

那么,有没有人知道如何停止"点击被发送到下面的窗口,以防我已经在我的表格中处理了它?基本上我希望能够选择点击"是否属于我"并且没有传播或者我的下面的窗口是否接收它。

2 个答案:

答案 0 :(得分:4)

正如Rob解释的那样,WS_EX_NOACTIVATE与此无关。很可能你使用了WS_EX_TRANSPARENT,这使得你的窗口对鼠标点击是透明的。

要获得更精细的鼠标单击透明度控制,请在顶级窗口中处理WM_NCHITTEST消息。为您想要“点击”的区域返回HTTRANSPARENT。否则返回,例如,HTCLIENT。

答案 1 :(得分:1)

Wm_ex_NoActivate应该与此无关。这只是控制你的窗口是否收到输入焦点。实际上,如果你从一个scratch program开始并且什么也不做,只改变扩展窗口样式,你会看到当你在该程序窗口的范围内点击时,点击是以通常的方式处理的,除了窗口永远不会激活;该窗口后面的程序不会收到任何点击事件。

因此,为了让你的标签控件吃点击事件而不是将它们转发到它们后面的窗口,你需要找出你做了什么让他们开始转发这些消息并简单地停止这样做,无论是什么。