首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Graphics.ScaleTransform的替代方案

Graphics.ScaleTransform的替代方案
EN

Stack Overflow用户
提问于 2011-10-14 12:57:43
回答 4查看 5.3K关注 0票数 5

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

通常,如果我想要适合我绘制到窗口的任何内容,我会计算适当的比率,并根据该比率对所有内容进行ScaleTransform:

代码语言:javascript
复制
e.Graphics.ScaleTransform(ratio, ratio);

ScaleTransform的问题是它缩放所有的东西,包括笔划和画笔。

如何缩放我正在绘制的所有像素坐标?每条直线、矩形或路径基本上都是一系列的点。因此,我可以手动将所有这些点乘以比率,但是有没有一种简单的替代方法可以更无缝地实现这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-16 17:39:18

您可以包装GDI图形对象并存储比例因子

代码语言:javascript
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-14 13:55:30

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

票数 2
EN

Stack Overflow用户

发布于 2011-10-14 13:44:39

我认为ScaleTransform可以处理GDI上下文所关注的每个数值,所以不幸的是,您不能只将它用于坐标。WPF有一个GeometryTransform,但我不知道在GDI+中有什么等同的。

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

您还可以尝试手动反转ScaleTransform,方法是将它的反转应用于任何不想缩放的对象;我知道有些笔刷会显示此方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7763210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档