当鼠标悬停在其上方时,实现UserControl的最简单方法是模拟“热轨”效果,在其周围绘制边框?Windows窗体上的“热轨”效果UserControl
我已经失败尝试继承覆盖,吸引了边境OnMouseHover事件自定义控件(看来,如果该事件没有被解雇)
谢谢!
当鼠标悬停在其上方时,实现UserControl的最简单方法是模拟“热轨”效果,在其周围绘制边框?Windows窗体上的“热轨”效果UserControl
我已经失败尝试继承覆盖,吸引了边境OnMouseHover事件自定义控件(看来,如果该事件没有被解雇)
谢谢!
通过在UC中使用仔细放置的面板控件,并通过监视低级别Windows消息来观察鼠标的位置,可以模拟用户控件周围边框的外观。
在UserControl设计表面上添加一个面板并调整面板的大小,以便只有UC的一小部分设计表面可见(请参阅下面的注释*)。设计表面的可见部分将是您的彩色边框,因此相应地设置其“厚度”。将组成您的UC的其他控件添加到面板。
你的控制可能是这样的:
实现在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;
}
}
注:当我测试这个我难以得到我的面板的背景色设置为不透明。我通过将设计器中的BackColor临时更改为不同的颜色,然后将其更改回默认颜色(Control)来解决此问题。
尝试向控件的“MouseEnter”和“MouseLeave”事件添加处理程序,该事件将更改控件的BorderStyle(如果有)。当鼠标在控件的边界内移动时,MouseEnter会被触发,当鼠标退出该边框时会触发MouseLeave。 MouseHover可能有一些额外的规则,例如鼠标必须静止一段时间。
谢谢!这正是我所期待的。 – Gerard 2011-05-06 13:12:29
我注意到,如果在窗体上方打开一个模式窗体,PreFilterMessage仍然在下面的窗体上执行......有没有办法解决这个问题? – Gerard 2011-05-09 11:59:05
你不需要做'Application.RemoveMessageFilter(this);'? 这是强制性的。你会如何把它放在'UserControl'中? – Odys 2012-06-22 09:23:39