Graphics.ScaleTransform的替代品

时间:2011-10-14 04:57:43

标签: c# graphics gdi+ scaletransform

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

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

e.Graphics.ScaleTransform(ratio, ratio);

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

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

4 个答案:

答案 0 :(得分:2)

首先尝试将所有对象放在GraphicsPath实例中。它没有ScaleTransform方法,但您可以使用GraphicsPath.Transform转换对象。您可以通过Matrix.Scale传递缩放矩阵。

答案 1 :(得分:1)

我认为ScaleTransform适用于GDI上下文所关注的每个数值,所以不幸的是,你不能只将它用于坐标。 WPF有一个GeometryTransform,但我不知道GDI +中的等价物。

如果您担心代码重复,您可以随时编写一个实用工具方法来绘制应用于其点的某个比例级别的形状。

您也可以尝试通过将其反转应用于您不想缩放的任何对象来手动反转ScaleTransform;我知道有些画笔暴露了这种方法。

答案 2 :(得分: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
}

答案 3 :(得分:0)

幸运的是,Pen有一个局部ScaleTransform,通过它可以进行反向重新缩放以补偿全局变换。 Pen.ResetTransform在使用每次重新缩放之后,或者当前的笔缩放(独立于图形上下文)可以缩小到几乎没有(实际上是一个像素),射到月球,或点到中途。