2011-01-23 69 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給出了鼠標指針的屏幕座標。所以我需要做一些轉換才能獲得可用的點,然後才能遞歸搜索特定的控件。 – 2011-01-23 21:05:13

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