Windows窗体UserControl上的“热门跟踪”效果

时间:2011-05-05 15:50:18

标签: c# winforms user-controls mouse

实现UserControl的最简单方法是什么,当鼠标悬停在其上方时,该模板会模仿在其周围绘制边框的“热轨”效果?

我试图继承一个自定义控件来覆盖绘制边框的OnMouseHover事件(似乎事件没有被触发),但是我没有成功。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

您的控件可能如下所示:
enter image description here

在UC中实施IMessageFilter接口。在PreFilterMessage()的实现中,您将检查鼠标相对于UC的位置,并在鼠标悬停在UC上时将UC的BackColor设置为边框颜色,或者在没有时将其设置为默认颜色。因为面板的BackColor没有改变,所以用户看起来就像你的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;
   }
}

注意:当我测试这个时,我很难让我的Panel的BackColor设置不透明。我通过暂时将设计器中的BackColor更改为不同的颜色然后将其更改回我的默认颜色(Control)来修复此问题。

答案 1 :(得分:0)

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