Graphics.ScaleTransform的替代品

Tre*_*ott 5 c# graphics gdi+ scaletransform

我正在使用GDI +进行自定义绘图.

通常情况下,如果我想要适合我正在绘制的窗口,我会计算出适当的比例,并且我按比例调整ScaleTransform的所有内容:

e.Graphics.ScaleTransform(ratio, ratio);
Run Code Online (Sandbox Code Playgroud)

ScaleTransform的问题在于它可以缩放包括笔划和笔刷在内的所有内容.

我可以缩放我绘制的所有像素坐标吗?每个线,矩形或路径基本上都是一系列点.所以我可以手动将所有这些点乘以比率,但是有一个简单的替代方案可以更加无缝地完成吗?

And*_*ren 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
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您只想避免缩放,因为您想要细(1 像素)线,则可以使用 -1 的粗细来绘制,以强制使用单个像素线,而不管比例如何。 (2认同)