Windows窗体用户控件上的"热轨迹"效果

5

如何实现一个用户控件,当鼠标悬停在上面时会出现“热点”效果,并在其周围绘制边框的最简单方法是什么?

我曾尝试继承自定义控件并重写OnMouseHover事件以绘制边框,但似乎该事件未被触发。

谢谢!

2个回答

2
您可以通过在用户控件中仔细放置Panel控件并监视低级Windows消息来模拟用户控件周围的边框外观。
在用户控件设计表面添加一个Panel,并调整Panel大小,使UC的设计表面只有一小部分可见(参见下面的注释*)。设计表面的可见部分将成为您的有色边框,因此请相应地设置其“厚度”。将组成UC的其他控件添加到面板中。
您的控件可能看起来像这样: enter image description here 在UC中实现IMessageFilter接口。在PreFilterMessage()的实现中,您将检查鼠标相对于UC的位置,并在鼠标悬停在UC上时将UC的BackColor设置为边框颜色,否则将其设置回默认颜色。由于Panel的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)来解决这个问题。


我注意到,如果一个模态窗体在另一个窗体上方打开,PreFilterMessage 仍然会在下面的窗体上执行...有没有办法捕捉到这个? - Gerard
你不需要执行 Application.RemoveMessageFilter(this); 吗?这是强制性的。如果要在 UserControl 中实现怎么做? - Odys

0
尝试为控件的“MouseEnter”和“MouseLeave”事件添加处理程序,以更改控件的BorderStyle(如果有)。当鼠标移动到控件边框内时,将触发MouseEnter事件;当鼠标退出该边框时,将触发MouseLeave事件。MouseHover可能具有一些额外的规则,例如鼠标必须保持静止一段时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接