2011-01-23 37 views
3

これはC# Get a control's position on a formの逆の質問です。C#フォームの特定の位置にコントロールを取得します。

フォーム内のポイントの位置が与えられている場合、その位置のユーザーがどのコントロールを表示できるかをどのようにして知ることができますか?

私は現在、HelpRequestedフォームイベントを使用して、別のヘルプフォームをMSDN: MessageBox.Show Methodのように表示しています。

MSDNの例では、senderイベントがヘルプメッセージを特定するために使用されますが、senderは常に私の場合はフォームであり、コントロールではありません。

HelpEventArgs.MousePosを使用してフォーム内の特定のコントロールを取得したいとします。

答えて

4

あなたは、フォーム上のControl.GetChildAtPointメソッドを使用することができます。いくつかのレベルを深くする必要がある場合は、これを再帰的に行う必要があります。 this answerも参照してください。

+1

、感謝します。 GetChildAtPointは、コントロールのクライアント領域の左上隅を基準にしています。HelpEventArgs.MousePosは、マウスポインタの画面座標を示します。ですから、特定のコントロールを再帰的に検索するには、いくつかの変換を行い、有用な点を得る必要があります。 –

2

あなたはControl.GetChildAtPointを使用することができます。

var controlAtPoint = theForm.GetChildAtPoint(thePosition); 
0

これは再帰的に、ユーザがクリックした時点で定義されたタグとコントロールを検索するためControl.GetChildAtPointとControl.PointToClientの両方を使用して修正されたコードの抜粋です。良いスタートザッツ

private void Form1_HelpRequested(object sender, HelpEventArgs hlpevent) 
{ 
    // Existing example code goes here. 

    // Use the sender parameter to identify the context of the Help request. 
    // The parameter must be cast to the Control type to get the Tag property. 
    Control senderControl = sender as Control; 

    //Recursively search below the sender control for the first control with a Tag defined to use as the help message. 
    Control controlWithTag = senderControl; 
    do 
    { 
     Point clientPoint = controlWithTag.PointToClient(hlpevent.MousePos); 
     controlWithTag = controlWithTag.GetChildAtPoint(clientPoint); 

    } while (controlWithTag != null && string.IsNullOrEmpty(controlWithTag.Tag as string)); 

    // Existing example code goes here.  
}