2012-04-19 9 views
6

FormのClientRectangle's "0,0"ではなく、Formの場所を基準にしてControlの場所を指定するプロパティを探しています。フォームの位置を基準にしてコントロールの位置を取得するにはどうすればよいですか?

もちろん、すべてを画面座標に変換できますが、これを行うより直接的な方法があるのだろうかと思います。

+0

あなたは、_controlのlocation_とはどういう意味ですか、それはあなたが望むカーソルの位置ですか? – uday

+0

@uDaY意味:画面の座標です。フォームが100,100でコントロールが150,350の場合、私は50,250を取得したいと思います。 – ispiro

+0

気をつけてください:http://stackoverflow.com/questions/8838621/how-to-determine-actual-windows-form-size-with-all-nonclient-elements-when-run –

答えて

2

答えは、これを行う直接的な方法はないと思われます。 は、技術的には質問の詳細を指定して、適切な(私はスクリーン座標を使用するより仕方を探しています質問で述べたように。)

9

画面座標に変換してから数学を行う必要があります。

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

フォームの場所はすでに画面座標になっています。今

:あなたのフォームの左上隅ではなく、フォームのクライアント領域に対する相対への相対的な位置を与える

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

+0

あなたの答えをありがとうが、私が質問に書いたように、私は画面の座標を確認するより直接的な方法を探しています。 – ispiro

+1

@ispiro:より直接的な方法は組み込まれていません。あなたは簡単にそのロジックを呼び出すことができる小さな関数にまとめることができます。または、フォームが最初に表示されたら、 'form.PointToScreen(new Point(0、0))'を呼び出して結果を保存し、XとYの値をコントロールの 'Location'に追加して、あなたのウィンドウ相対座標を取得します。 –

+0

私の最後のコメントについて。私はフォームのクライアント領域の位置を取得するために 'PointToScreen'を呼び出し、位置を取得するためにLocationのXとYの値を減算することを意味しました。申し訳ありません。 –

3

これはあなたの質問に答えると思います。 "this"はフォームです。

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

あなたの答えをありがとうが、私が質問に書いたように、私は画面の座標を確認するより直接的な方法を探しています。 – ispiro

+0

+1を入力します。 – ispiro

1

選択答えがされています。そのようなプロパティがありません.NETフレームワークには存在しません。

ただし、このようなプロパティが必要な場合は、ここでトリックを行うコントロール拡張機能があります。はい、画面座標を使用していますが、投稿のタイトルの一般的な性質を考慮すると、このページにアクセスしたユーザーの中にはこの機能が役立つことがあります。

ちなみに、コントロールの親をすべてループすることで、画面座標なしでこれを実行しようとしました。私は調整する2つの方法を決して得ることができませんでした。これは、Aeroが窓の大きさについてどのようにしているかについてのOPに対するHans Passantのコメントによるものかもしれません。

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

関連する問題