【问题标题】:WinForms equivalent of WPF's IsHitTestVisibleWinForms 等效于 WPF 的 IsHitTestVisible
【发布时间】:2011-02-24 09:54:36
【问题描述】:

我有一个按钮覆盖,它有一个子标签。我在按钮控件上附加了 MouseEnter 和 Leave 事件。

当鼠标进入标签时,按钮的事件被取消(这是自然的)。我的问题是如何在不实际禁用标签的情况下禁用标签的命中测试。

我希望它保留它的颜色并且我希望它能够改变颜色(例如按钮上的 MouseEnter),但是当鼠标悬停在标签上时,要考虑在按钮上进行命中测试。

PS:我知道我可以在标签上添加鼠标进入和离开并处理这些情况,但我希望控件是自给自足的,这样如果参数在它之外发生变化(鼠标进入和离开时的颜色),控件仍将正常工作。

【问题讨论】:

    标签: c# wpf winforms inheritance hittest


    【解决方案1】:

    在寻找其他信息时遇到了这个问题,并且不相信接受的答案真的正确。

    您可以在 WndProc 中扩展标签并更改 hittest 响应。大致如下:

    public class HTTransparentLabel : Label
    {
        private const int WM_NCHITTEST = 0x84; 
        private const int HTTRANSPARENT = -1; 
    
        protected override void WndProc(ref Message message) 
        { 
            if ( message.Msg == (int)WM_NCHITTEST ) 
                message.Result = (IntPtr)HTTRANSPARENT; 
            else 
                base.WndProc( ref message ); 
        }
    }
    

    【讨论】:

      【解决方案2】:

      简短的回答是你不能。按钮和标签实际上都是窗口,所以当鼠标离开另一个时,会产生 mouseenter 和 mouseleave 事件。

      真正的问题是,为什么需要在按钮上添加标签?

      【讨论】:

      • 我需要一个用于自定义面板的自定义标题,称为可折叠面板。您可能已经猜到,当我单击按钮时,面板会展开/折叠。现在我希望该按钮具有两个元素:1. 一个图像(折叠/展开的箭头),幸运的是该按钮具有,以及 2. 标题文本;如果我要使用按钮的默认 Text 属性,则两者(图像和文本)会重叠(不,文本中的空白不是一个选项),所以我采用了标签方法,将其设置为宽度的图像,以便我最终得到一个干净的图像,然后是 HeaderText 布局。
      • "为什么需要在按钮上添加标签?"因为一个通用的 WinForms 按钮不可能封装所有的设计要求。此外,WPF 极大地鼓励了这种行为,因此 OP 提出了问题。
      猜你喜欢
      • 2013-12-05
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2011-08-22
      相关资源
      最近更新 更多