3

私は次のコードをテストしています:

protected override void OnMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);
    Rectangle leftRect = new Rectangle(0, 0, 32, this.Height);
    if (leftRect.Contains(e.Location))
    {
        MessageBox.Show("Hello World");
    }
}

マウスがコンテナコントロールの左側の32ピクセル幅の領域に入ると、メッセージが表示されます(OK、R / Lでは別のことを行いますが、これは今のところ純粋にテスト中です)。

問題は、子コントロールが長方形の領域にデータを入力するときに、ContainerControlがMouseMoveイベントを受け取らないことです。これは、子コントロールによって処理されているためです。

だから私の質問は、その子が同じ長方形の領域に配置されている場合でも、ContainerControlにMouseMoveイベントを受信させるにはどうすればよいですか?

4

1 に答える 1

2

WPFは、この種のことではるかに優れています。私はこのような関数をよく使用します:

public static List<Control> GetAllControlsRecurs(List<Control> list, 
                                                 Control parent)
{
    if (parent == null)
        return list;
    else
    {
        list.Add(parent);
    }
    foreach (Control child in parent.Controls)
    {
        GetAllControlsRecurs(list, child);
    }
    return list;
}

これにより、特定の親コントロール内のすべての子コントロールとその子などのリストが返されます。次に、次のようなことを行うことができます:

private void Form1_Load(object sender, EventArgs e)
{
    List<Control> ctlList = new List<Control>();
    GetAllControlsRecurs(ctlList, this);
    foreach (Control ctl in ctlList) ctl.MouseMove += Form1_MouseMove;
}

で動的に追加(および削除)されたコントロールを処理するControlAdded必要がありますが、これで少なくとも開始できます。ここで、これはオーバーライドされたOnMouseMoveメソッドではなく、フォームのMouseMoveイベントハンドラーでコードを実行することに注意してください。これを派生クラスに組み込むためのソリューションは他にもたくさんありますが、ここで重要なのは、子コントロールを識別して単一のイベントに接続する手段です。

于 2013-02-11T15:02:53.797 に答える