C# &引用;热轨“;对Windows窗体用户控件的影响

C# &引用;热轨“;对Windows窗体用户控件的影响,c#,winforms,user-controls,mouse,C#,Winforms,User Controls,Mouse,实现UserControl的最简单方法是什么?它模仿鼠标悬停在其上方时在其周围绘制边框的“热跟踪”效果 我尝试继承一个自定义控件失败,该控件重写了绘制边框的onmousehave事件(似乎没有触发该事件) 谢谢 尝试向控件的“MouseEnter”和“MouseLeave”事件添加处理程序,这些事件将更改控件的边框样式(如果有)。当鼠标在控件的边框内移动时,会触发MouseEnter,当鼠标退出该边框时,会触发MouseLeave。MouseHover可能有一些额外的规则,比如鼠标必须在一定时间

实现UserControl的最简单方法是什么?它模仿鼠标悬停在其上方时在其周围绘制边框的“热跟踪”效果

我尝试继承一个自定义控件失败,该控件重写了绘制边框的onmousehave事件(似乎没有触发该事件)


谢谢

尝试向控件的“MouseEnter”和“MouseLeave”事件添加处理程序,这些事件将更改控件的边框样式(如果有)。当鼠标在控件的边框内移动时,会触发MouseEnter,当鼠标退出该边框时,会触发MouseLeave。MouseHover可能有一些额外的规则,比如鼠标必须在一定时间内保持静止。

您可以通过在UC中小心放置面板控件,并通过监视低级Windows消息来观察鼠标的位置,来模拟用户控件周围边框的外观

在UserControl设计图面上添加一个面板,并调整面板大小,以便只有一小部分UC设计图面可见(请参见下面的注释*)。设计表面的可见部分将是您的彩色边框,因此相应地设置其“厚度”。将构成UC的其他控件添加到面板中

您的控件可能如下所示:

在UC中实现IMessageFilter接口。在PreFilterMessage()的实现中,您将检查鼠标相对于UC的位置,并在鼠标位于UC上方时将UC的背景色设置为边框颜色,否则将其设置为默认颜色。因为面板的背景色不会改变,所以用户会觉得它就像UC的边框一样

以下是执行此操作所需的最低代码量:

public partial class UserControl1 : UserControl, IMessageFilter
{
    public UserControl1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m) {
        if (!this.IsDisposed && this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) {
            this.BackColor = Color.Green; // Or whatever border color you want.
        } else {
            this.BackColor = SystemColors.Control;  // Back to the UC's default border color.
        }
        return false;
   }
}

注意:当我测试这个时,我很难将面板的背景色设置为不透明。我通过临时将设计器中的背景色更改为其他颜色,然后将其更改回默认颜色(控件)来解决此问题。

谢谢!这正是我要找的。我注意到,如果在表单上方打开模式表单,则PreFilterMessage仍会在下面的表单上执行。。。有没有办法捕捉到这一点?你不需要做
Application.RemoveMessageFilter(这个)?这是强制性的。如何将其放入
用户控件