1

アプリにズーム機能を追加したいと考えています。そのコアは spf グラフ アプリです。現在、ズーム機能はありませんが、グラフ ウィンドウでグラフ上のオブジェクトを複数選択して選択/移動できます。オブジェクトのスケーリングを行う独自のコードを書き始め、マウスの座標を計算してクリックと再描画を正しくマッピングしました。ウィンドウをうまくスケーリングする Gdiplus::SetPageScale 関数を見つけたので、これを完了しませんでしたが、マウス クリック座標をワールド座標からページ座標にマップするために使用できる GDI 関数が表示されません。TransformPoints(Gdiplus::CoordinateSpaceWorld, ::Gdiplus::CoordinateSpacePage, points, 2) を試しましたが、これはポイントを変換せず、返されるポイントは (0,0) です。

これはGdiplusでも可能ですか、それともこのマッピングを自分で書く必要がありますか? アドバイスをいただければ幸いです。

4

2 に答える 2

0

この場合、 Graphics::SetPageScale() を使用したくありません。より一般的な方法は、代わりに Matrix クラスを使用することです。Scale、Translate、Rotate メソッドは、必要な行列を取得するのに便利です。ここで Scale() メソッドを使用することをお勧めします。おそらく Translate() を使用して原点を変更します。

描画を開始する前に、Graphics::SetTransform() メソッドでマトリックスをアクティブにします。描画するものはすべて、Matrix::Scale() メソッドに渡した引数に従って自動的にスケーリングされます。Matrix::TransformPoints() メソッドを使用すると、マウス位置のマッピングが非常に簡単になり、描画中に使用されたものとまったく同じ変換がマウス座標に適用されるようになりました。グラフ座標からマウス座標に戻るのも簡単です。Matrix::Invert() メソッドを使用して逆変換を取得します。

于 2013-06-01T18:13:20.583 に答える
0

GDI+ が描画するとき、ワールド変換 (Graphics::SetTransform、ScaleTransform などによって制御される) を適用し、続いてページ変換 (Graphics::SetPageScale および Graphics::SetPageUnit によって制御される) を適用して、ポイントをデバイスに変換します。座標。

ワールド座標 --[ワールド変換]--> ページ座標 --[ページ変換]--> デバイス座標

Graphics::TransformPoints を好きなように使用して、マウス座標をワールド座標にマッピングできますが、ソース空間としてデバイス座標を指定し、宛先空間としてワールド座標を指定する必要があります。

ただし、ハンスが個別に保存するマトリックスで説明しているように、それを行うには十分な理由があります。それから)。

于 2013-06-03T05:10:55.980 に答える