2012-04-19 46 views
6

我正在尋找一個屬性,該屬性給了我們一個控件相對於其表單位置的位置,而不是表單的ClientRectangle's「0,0」。如何獲取控件相對於其表單位置的位置?

當然,我可以將所有內容都轉換爲屏幕座標,但是我想知道是否有更直接的方法來做到這一點。

+0

_control的位置究竟意味着什麼?是否需要光標的位置? – uday 2012-04-19 20:41:22

+0

@uDaY我的意思是:在屏幕座標。如果表格是100,100,而控制在150,350,我想得到50,250。 – ispiro 2012-04-19 20:44:21

+0

小心:http://stackoverflow.com/questions/8838621/how-to-determine-actual-windows-form-size-with-all-nonclient-elements-when-run – 2012-04-19 21:18:22

回答

2

看來答案是沒有直接的方法來做到這一點。

(正如我在我要找的不是使用屏幕座標的方式其他問題說明)

9

你需要轉換爲屏幕座標,然後做一些數學計算。

Point controlLoc = form.PointToScreen(myControl.Location); 

窗體的位置已經在屏幕座標中。

現在:

Point relativeLoc = new Point(controlLoc.X - form.Location.X, controlLoc.Y - form.Location.Y); 

這會給你的相對位置,以表格的左上角,而不是相對於形式的客戶區。

+0

感謝您的回答,但正如我在問題中所寫的,我正在尋找比檢查屏幕座標更直接的方法。 – ispiro 2012-04-19 20:59:18

+1

@ispiro:沒有更直接的方法。你可以很容易地把這個邏輯放到一個你可以調用的小函數中。或者,當表單第一次顯示時,您可以調用'form.PointToScreen(new Point(0,0))',保存結果,然後在想要的時候將X和Y值添加到控件的'Location'中得到你的窗口相對座標。 – 2012-04-19 21:25:42

+0

關於我最近的評論。我的意思是你調用'PointToScreen'獲取表單的客戶區域位置,並減去Location的X和Y值來獲得偏移量。對於那個很抱歉。 – 2012-04-20 00:06:54

3

我認爲這會回答你的問題。請注意,「這是」的形式。

Rectangle screenCoordinates = control.Parent.ClientToScreen(control.ClientRectangle); 
Rectangle formCoordinates = this.ScreenToClient(screenCoordinates); 
+0

感謝您的回答,但正如我在問題中寫到的,我正在尋找比檢查屏幕座標更直接的方法。 – ispiro 2012-04-19 21:00:19

+0

用於輸入。 – ispiro 2012-04-22 15:18:54

1

選擇的答案是技術上正確給出的問題的細節:這樣的財產不不存在於.NET框架中。

但是,如果你想要這樣一個屬性,這裏是一個控制擴展將會做的伎倆。是的,它使用屏幕座標,但考慮到帖子標題的一般性質,我確信一些登陸此頁面的用戶可能會覺得這很有用。

順便說一句,我花了幾個小時試圖做到這一點沒有屏幕座標通過循環所有的控制父母。我永遠無法讓這兩種方法協調一致。這可能是由於Hans Passant對OP的評論,關於Aero如何關注窗口大小。

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

namespace Cambia 
{ 
    public static class ControlExtensions 
    { 
     public static Point FormRelativeLocation(this Control control, Form form = null) 
     { 
      if (form == null) 
      { 
       form = control.FindForm(); 
       if (form == null) 
       { 
        throw new Exception("Form not found."); 
       } 
      } 

      Point cScreen = control.PointToScreen(control.Location); 
      Point fScreen = form.Location; 
      Point cFormRel = new Point(cScreen.X - fScreen.X, cScreen.Y - fScreen.Y); 

      return cFormRel; 

     } 

    } 
} 
+1

這是一個很好的解決方案。雖然,我相信你的意思是返回'cFormRel'。 – dshrout 2018-02-10 12:46:58

相關問題