我正在使用GDI+进行自定义绘图。
通常,如果我想要适合我绘制到窗口的任何内容,我会计算适当的比率,并根据该比率对所有内容进行ScaleTransform:
e.Graphics.ScaleTransform(ratio, ratio);ScaleTransform的问题是它缩放所有的东西,包括笔划和画笔。
如何缩放我正在绘制的所有像素坐标?每条直线、矩形或路径基本上都是一系列的点。因此,我可以手动将所有这些点乘以比率,但是有没有一种简单的替代方法可以更无缝地实现这一点?
发布于 2011-10-16 17:39:18
您可以包装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-14 13:55:30
首先尝试将所有对象放在GraphicsPath实例中。它没有ScaleTransform方法,但您可以使用GraphicsPath.Transform转换对象。您可以通过Matrix.Scale传递伸缩矩阵。
发布于 2011-10-14 13:44:39
我认为ScaleTransform可以处理GDI上下文所关注的每个数值,所以不幸的是,您不能只将它用于坐标。WPF有一个GeometryTransform,但我不知道在GDI+中有什么等同的。
如果你担心代码重复,你总是可以编写一个实用的方法来绘制形状,并将一定的比例级别应用到它们的点上。
您还可以尝试手动反转ScaleTransform,方法是将它的反转应用于任何不想缩放的对象;我知道有些笔刷会显示此方法。
https://stackoverflow.com/questions/7763210
复制相似问题