Ger*_*ard 5 c# mouse user-controls winforms
实现UserControl的最简单方法是什么,当鼠标悬停在其上方时,模仿"自动绘制边框"的"热轨"效果?
我没有成功尝试继承一个自定义控件来覆盖绘制边框的OnMouseHover事件(好像事件没有被触发)
谢谢!
您可以通过在 UC 中使用精心放置的面板控件来模拟用户控件周围边框的外观,并通过监视低级别 Windows 消息来观察鼠标的位置。
在 UserControl 设计图面上添加一个面板并调整面板大小,以便只有 UC 设计图面的一小部分可见(请参见下面的注释*)。设计表面的可见部分将是您的彩色边框,因此请相应地设置其“厚度”。将构成 UC 的其他控件添加到面板中。
您的控件可能如下所示:

在您的 UC 中实现 IMessageFilter 接口。在 PreFilterMessage() 的实现中,您将检查鼠标相对于 UC 的位置,并在鼠标位于 UC 上方时将 UC 的 BackColor 设置为边框颜色,或者在不在 UC 上方时设置为默认颜色。因为面板的 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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意: 当我对此进行测试时,我很难将面板的背景色设置设置为不透明。我通过暂时将设计器中的背景颜色更改为不同的颜色,然后将其更改回我的默认颜色(控件)来修复此问题。