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