5

GDI+ を使用してカスタム描画を行っています。

通常、描画しているものをウィンドウに合わせたい場合は、適切な比率を計算し、その比率ですべてを ScaleTransform します。

e.Graphics.ScaleTransform(ratio, ratio);

ScaleTransform の問題は、ペン ストロークやブラシを含むすべてをスケーリングすることです。

描画しているすべてのピクセル座標をスケーリングする必要がありますか? すべての線、四角形、またはパスは、基本的に一連の点です。したがって、これらすべてのポイントに手動で比率を掛けることができますが、これをよりシームレスに行うための簡単な代替手段はありますか?

4

4 に答える 4

2

最初にすべてのオブジェクトをGraphicsPathインスタンスに入れてみてください。メソッドはありませんが、ScaleTransformでオブジェクトを変換できますGraphicsPath.Transform。を介してスケーリング行列を渡すことができますMatrix.Scale

于 2011-10-14T05:55:29.687 に答える
1

GDIグラフィックスオブジェクトをラップして、倍率を保存できます

interface IDrawing
{
   void Scale(float sx, float sy);
   void Translate(float dx, float dy);
   void SetPen(Color col, float thickness);
   void DrawLine(Point from, Point to);
   // ... more methods
}

class GdiPlusDrawing : IDrawing
{
   private float scale;
   private Graphics graphics;
   private Pen pen;

   public GdiPlusDrawing(Graphics g)
   {
      float scale = 1.0f;
   }

   public void Scale(float s)
   {
       scale *= s;
       graphics.ScaleTransform(s,s);
   }

   public void SetPen(Color color, float thickness)
   {
       // Use scale to compensate pen thickness.
       float penThickness = thickness/scale;
       pen = new Pen(color, penThickness);   // Note, need to dispose.
   }

   // Implement rest of IDrawing
}
于 2011-10-16T09:39:18.017 に答える
1

ScaleTransformGDIコンテキストが関係するすべての数値で機能すると思うので、残念ながら座標に使用することはできません。WPF には がありGeometryTransformますが、GDI+ に相当するものは知りません。

コードの重複が気になる場合は、特定のスケール レベルをポイントに適用してシェイプを描画するためのユーティリティ メソッドをいつでも作成できます。

ScaleTransformスケーリングしたくないオブジェクトにその逆を適用して、手動で逆にすることもできます。一部のブラシがこのメソッドを公開していることを知っています。

于 2011-10-14T05:44:39.063 に答える
0

幸い、PenにはローカルScaleTransformがあり、これにより、グローバル変換を補正するために逆再スケーリングを実行できます。Pen.ResetTransformは、次の再スケーリングの前に各再スケーリングを使用した後、または現在のペンスケーリング(グラフィックスコンテキストに関係なく)がほとんどゼロ(実際には1ピクセル)に縮小したり、月に向かって撮影したり、途中でポイントしたりする可能性があります。

于 2012-05-02T00:13:45.597 に答える