web-dev-qa-db-ja.com

マウスカーソルの下で制御を取得する方法?

ボタンの少ないフォームがあり、カーソルの下にあるボタンを知りたい。

追伸多分それは重複していますが、私はこの質問に対する答えを見つけることができません。

19
Poma

GetChildAtPoint をご覧ください。コントロールがコンテナーに含まれている場合は、追加の作業を行う必要があります。 Control.PointToClient を参照してください。

28
Philip Fourie

多分GetChildAtPointPointToClientはほとんどの人にとって最初のアイデアです。私も最初に使用しました。ただし、GetChildAtPointは、非表示のコントロールや重複したコントロールでは正しく機能しません。以下は適切に機能するコードであり、これらの状況を管理します。

using System.Drawing;
using System.Windows.Forms;

public static Control FindControlAtPoint(Control container, Point pos)
{
    Control child;
    foreach (Control c in container.Controls)
    {
        if (c.Visible && c.Bounds.Contains(pos))
        {
            child = FindControlAtPoint(c, new Point(pos.X - c.Left, pos.Y - c.Top));
            if (child == null) return c;
            else return child;
        }
    }
    return null;
}

public static Control FindControlAtCursor(Form form)
{
    Point pos = Cursor.Position;
    if (form.Bounds.Contains(pos))
        return FindControlAtPoint(form, form.PointToClient(pos));
    return null;
}

これにより、カーソルのすぐ下にコントロールが表示されます。

19
Wisebee
// This getYoungestChildUnderMouse(Control) method will recursively navigate a       
// control tree and return the deepest non-container control found under the cursor.
// It will return null if there is no control under the mouse (the mouse is off the
// form, or in an empty area of the form).
// For example, this statement would output the name of the control under the mouse
// pointer (assuming it is in some method of Windows.Form class):
// 
// Console.Writeline(ControlNavigatorHelper.getYoungestChildUnderMouseControl(this).Name);


    public class ControlNavigationHelper
    {
        public static Control getYoungestChildUnderMouse(Control topControl)
        {
            return ControlNavigationHelper.getYoungestChildAtDesktopPoint(topControl, System.Windows.Forms.Cursor.Position);
        }

        private static Control getYoungestChildAtDesktopPoint(Control topControl, System.Drawing.Point desktopPoint)
        {
            Control foundControl = topControl.GetChildAtPoint(topControl.PointToClient(desktopPoint));
            if ((foundControl != null) && (foundControl.HasChildren))
                return getYoungestChildAtDesktopPoint(foundControl, desktopPoint);
            else
                return foundControl;
        }
    }
4
Peter B. Nelson

あなたはそれをいくつかの方法で行うことができます:

  1. フォームのコントロールのMouseEnterイベントをリッスンします。 「sender」パラメータは、どのコントロールがイベントを発生させたかを教えてくれます。

  2. _System.Windows.Forms.Cursor.Location_を使用してカーソル位置を取得し、Form.PointToClient()を使用してフォームの座標にマッピングします。次に、ポイントをForm.GetChildAtPoint()に渡して、そのポイントの下にあるコントロールを見つけることができます。

アンドリュー

2
Andrew

ボタンタイプのパブリック変数に送信者ボタンを割り当てる各ボタンでon-Mouse-overイベントを定義するのはどうですか

1
Radian