C# 检测光标是否在控件的边界内
我有一个用户控件C# 检测光标是否在控件的边界内,c#,winforms,C#,Winforms,我有一个用户控件 public partial class UserControl1 : UserControl, IMessageFilter { public UserControl1() { InitializeComponent(); Application.AddMessageFilter(this); } public bool PreFilterMessage(ref Message m) {
public partial class UserControl1 : UserControl, IMessageFilter
{
public UserControl1()
{
InitializeComponent();
Application.AddMessageFilter(this);
}
public bool PreFilterMessage(ref Message m)
{
var mouseLocation = Cursor.Position;
if (Bounds.Contains(PointToClient(mouseLocation)))
{
bool aBool = true;//breakpoint
bool two = aBool;//just assignment so compiler doesn't optimize my bool out
}
if (m.Msg != 0x20a) // Scrolling Message
{
return false;//ignore message
}
return false;
}
}
当我浮动在父窗体中包含的用户控件上时,不会命中断点。断点在很近的地方被击中,但我可以在用户控件内的实际文本框中,而不会被击中。我如何才能准确地确定我是否在该用户控件的范围内
我有两个监视器。我使用的监视器似乎没有什么区别。仅为了快速技巧,您可以用一个事件触发所有userconrol控件,并处理鼠标悬停事件。 例如,如果用户控件中有两个文本框
textBox1.MouseMove += new MouseEventHandler(controls_MouseMove);
textBox2.MouseMove += new MouseEventHandler(controls_MouseMove);
...
void controls_MouseMove(object sender, MouseEventArgs e)
{
Control subc=sender as Control;
int mouseX = MousePosition.X;
....
}
尝试对控件而不是
控件进行命中测试。界限:
if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) {
bool aBool = true;//breakpoint
bool two = aBool;
}
@DanielA.White的可能副本我在您的链接中看到的答案特定于单个控件。注意,这里我连接到一个全局消息过滤器。我认为这些都行不通。最后,我需要确切地知道鼠标在哪个控件上,而不仅仅是包含子控件的一般用户控件。请记住,至少有些控件在收到鼠标按下事件时会触发mousemove事件。我发现解决这个问题的最好方法是在mouse move的事件处理程序中仔细检查鼠标指针是否确实在控制范围之外。如果这是来自MouseEventArgs
的,您甚至可以从中获取Location
属性,而不使用PointToClient
。