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

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

如果您担心代码重复,您总是可以编写一个实用方法来绘制形状,并将一定比例级别应用于它们的点。

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

于 2011-10-14T05:44:39.063 回答
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 回答
0

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

于 2012-05-02T00:13:45.597 回答