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、私は2台のモニターを持っています。私が使用しているモニターに違いはないようです。

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

ちょっとしたトリックのために、1つのイベントですべてのuserconrolの制御をトリガーし、イベント上でマウスを処理することができます。たとえば、ユーザーコントロールに2つのテキストボックスがある場合

    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 に答える