【问题标题】:Hittest transparency for an entire form整个表单的最高透明度
【发布时间】:2012-06-16 14:35:29
【问题描述】:

是否可以在不调整表单可见性的情况下使表单的整个边界都透明化?

我正在使用对WindowFromPoint 的user32 api 调用,以便在鼠标下找到控件。在某些情况下,我想忽略浮动在主窗体(或另一个子窗体)前面的子窗体的存在,但保持此窗体忽略可见。

将要忽略的表单的不透明度设置为 0 将成功地导致 hittest 直接通过它,但表单显然是不可见的,我希望它保持可见。

既然这个子窗体上可以有任意数量的控件,有没有办法让这个窗体拦截所有WM_NCHITTEST 发送到窗体上子控件的消息,以便我可以为每个控件返回最合适的透明度?表单中包含的控件是任意的,因此我无法在内部对其进行修改。

【问题讨论】:

  • 您是否尝试过在要捕获消息的表单中覆盖 WndProc 方法?如果这不起作用,那么您可以使用 MessageFilter,更多信息:social.msdn.microsoft.com/Forums/en/netfxbcl/thread/…
  • 您要为过滤应用哪些实际规则?见:msdn.microsoft.com/en-us/library/ms158404.aspx
  • @Emo 我正在从另一个表单中测试一个表单,而不是表单的子控件,因此是 win32 api 调用。
  • @SebastianPiu 在表单中覆盖 WndProc 只会禁用表单区域本身的最热门响应,而不是表单上的任何子控件,因此您仍然可以最终在表单上点击某些内容. MessageFilter 看起来可能是我正在寻找的东西,我会更详细地查看它。
  • @SebastianPiu 似乎 WM_NCHITTEST 绕过了消息队列并直接发送到控件,因此消息过滤器没有机会处理它。

标签: c# winforms hittest wndproc


【解决方案1】:

您正在寻找 WS_EX_TRANSPARENT Windows 样式。

This answer 给出了足够好的解释。

【讨论】:

  • 宾果游戏! WS_EX_TRANSPARENT 与 WS_EX_LAYERED 配合使用即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2019-02-08
  • 2015-08-02
  • 2013-01-17
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多