21

我有一个用户控件

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;
    }
}

当我漂浮在包含在父窗体中的用户控件上时,没有命中断点。断点在附近被击中,但我可以在用户控件内的实际文本框中而不被击中。如何准确确定我是否在此用户控件的范围内?

FWIW,我有两台显示器。我使用的显示器似乎没有什么区别。

4

2 回答 2

59

尝试针对Control.ClientRectangle而不是进行命中测试Control.Bounds

if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) {
    bool aBool = true;//breakpoint 
    bool two = aBool;
}
于 2012-09-20T20:22:08.237 回答
-3

只是为了快速技巧,您可以通过一个事件触发所有 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;
        ....
    }
于 2012-09-20T20:20:34.683 回答