2011-05-05 67 views
5

当鼠标悬停在其上方时,实现UserControl的最简单方法是模拟“热轨”效果,在其周围绘制边框?Windows窗体上的“热轨”效果UserControl

我已经失败尝试继承覆盖,吸引了边境OnMouseHover事件自定义控件(看来,如果该事件没有被解雇)

谢谢!

回答

2

通过在UC中使用仔细放置的面板控件,并通过监视低级别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; 
    } 
} 

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

+0

谢谢!这正是我所期待的。 – Gerard 2011-05-06 13:12:29

+0

我注意到,如果在窗体上方打开一个模式窗体,PreFilterMessage仍然在下面的窗体上执行......有没有办法解决这个问题? – Gerard 2011-05-09 11:59:05

+0

你不需要做'Application.RemoveMessageFilter(this);'? 这是强制性的。你会如何把它放在'UserControl'中? – Odys 2012-06-22 09:23:39

0

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