我正在使用GDI+进行自定义绘图。
通常,如果我想让我画的东西适合窗口,我会计算适当的比例,然后按比例缩放所有东西:
e.Graphics.ScaleTransform(ratio, ratio);
ScaleTransform的问题在于它会缩放所有东西,包括笔触和画笔。
我如何缩放我正在绘制的所有像素坐标?每条线、矩形或路径基本上都是一系列的点。所以我可以手动将所有这些点乘以比率,但是有没有更简单的替代方法可以无缝地做到这一点?
首先尝试将所有对象放在GraphicsPath
实例中。它没有ScaleTransform
方法但是你可以用GraphicsPath.Transform
变换对象。您可以通过Matrix.Scale
传递缩放矩阵
可以包装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
}
我认为ScaleTransform
适用于GDI上下文所关注的每个数值,因此不幸的是,您不能仅将其用于坐标。WPF有一个GeometryTransform
,但我不知道GDI+中有一个等价的。
如果你担心代码重复,你总是可以写一个实用程序方法来绘制形状,并将一定的比例水平应用于它们的点。
你也可以尝试手动反转ScaleTransform
,通过将它的逆应用到任何你不想缩放的对象;我知道有些笔刷会使用这个方法
幸运的是,Pen有一个局部ScaleTransform,通过它可以反向重新缩放来补偿全局变换。钢笔。在使用每次重新缩放之后,在下一次之前进行ResetTransform,或者当前笔缩放(独立于图形上下文)可以缩小到几乎为零(实际上是一个像素),拍摄到月球,或者点在中间。