2016-05-19 7 views
2

私はグラフプログラムを作って、マウスの座標をグラフィックスケールに等しくする必要があるところでつまむ。 MouseMove機能を使用してマウス座標を変換する

RectangleF world = new RectangleF(wxmin, wymin, wwid, whgt); 
     PointF[] device_points = 
      { 
       new PointF(0, PictureBox1.ClientSize.Height), 
       new PointF(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height), 
       new PointF(0, 0), 
      }; 
     Matrix transform = new Matrix(world, device_points); 
     gr.Transform = transform; 

enter image description here イム:ピクチャボックスで、私は私のグラフィックを拡張する変換を使用します。マウス座標を変換する方法はありますか?私は、x = 9の上に私のマウスを置いたとき、私は私のマウスを必要とする9

private void PictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine(e.X); 
    } 
+2

* transform *のトラックを失うことはありません。 Invert()メソッドが好きでしょう。マウス座標をグラフ座標に戻すのに便利です。 –

答えて

2

としてハンスはコメントを意味する座標、あなたはこれを実現するために、第2 Matrixを使用することができます。オリジナルのMatrixをコピーしてコピーのInvert()メソッドを呼び出すか、入力矩形を元のものと逆にして、最初から新しいMatrixを作成することによって取得できます。

IMHOの反転は簡単ですが、逆行列を作成してどこかに格納する必要があります。例えば:あなたのマウス処理コードは、後でそれを使用することができるように

Matrix transform = new Matrix(world, device_points); 
    gr.Transform = transform; 
    inverseTransform = transform.Clone(); 
    inverseTransform.Invert(); 

inverseTransformは、あなたのクラスのフィールドではなく、ローカル変数です。

あなたはMatrix、後で、あなたはこのようにそれを行うことができ構築しなければならない場合は、次のいずれかの場合には

RectangleF device = new RectangleF(new Point(), PictureBox1.ClientSize); 
PointF[] world_points = 
    { 
     new PointF(wxmin, wymin + whgt), 
     new PointF(wxmin + wwid, wymin + whgt), 
     new PointF(wxmin, wymin), 
    }; 
Matrix inverseTransform = new Matrix(device, world_points); 

、あなたは単に逆に変換を適用するためにあなたのマウス処理コードにMatrix.TransformPoints()メソッドを使用したいですマウスの座標はあなたの世界の座標に戻ります。

+0

私はこれをしましたが、同じX値とY値を返します。 'inverseTransform = transform.Clone(); inverseTransform.Invert(); リスト場所=新しいリスト(); ポイントp =新しいポイント(e.X、e.Y); location.Add(p); inverseTransform.TransformPoints(location.ToArray()); Console.WriteLine( "location =" + location [0]); ' – WhizBoy

+2

ここにあなたのコメントに基づいて:ポイントの値はインプレースで変換されます。 'TransformPoints()'メソッドに渡すために新しい配列を作成しましたが、その配列への参照を保持するのではなくメソッドに直接渡します。メソッドはポイントを変換しますが、新しい値を取得する方法はありません。 'Point [] location = {new Point(e.X、e.Y)};を試してください。 inverseTransform.TransformPoints(場所); '。 –

関連する問題