缩放时为笔 DashStyle 保持恒定的空间

Keep constant spaces for pen DashStyle when zooming

我正在使用 Graphics class 在 C# 控件上实现绘图。我需要实现缩放功能,但我注意到虚线有奇怪的行为。当我放大它们时,破折号之间的空间会改变,即使笔宽没有改变。

我添加了一个示例代码来在 PictureBox 中间绘制一条水平虚线,通过单击按钮 1 或按钮 2 更改缩放级别。笔初始化如下:

Pen pen = new Pen(Color.Aqua, 8f);
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;

更改缩放级别:

private void button1_Click(object sender, EventArgs e)
{
  scale *= 2f;
  pictureBox1.Refresh();
}

private void button2_Click(object sender, EventArgs e)
{
  scale /= 2f;
  pictureBox1.Refresh();
}

正在刷新图片框:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
  e.Graphics.ScaleTransform(scale, scale);
  pen.ScaleTransform(scale, scale);
  e.Graphics.FillRectangle(Brushes.Black, new RectangleF(0, 0, this.pictureBox1.Width/scale, this.pictureBox1.Height/scale));
  e.Graphics.DrawLine(pen, 0, this.pictureBox1.Height / (2 * scale), this.pictureBox1.Width / scale, this.pictureBox1.Height / (2 * scale));
}

钢笔经过变换以在不同的缩放级别下保持宽度不变,但破折号之间的间距仍然会发生变化。

有没有办法让它们在缩放时保持不变?

如果无论比例如何都需要保持视觉笔的大小(宽度和空格)不变,您可以计算比例笔的宽度并替换线条:

pen.ScaleTransform(scale, scale);

与:

pen.Width = 8f / scale; //8f is initial pen width for scale = 1

这样线路会一直保持不变。

要在缩放图形对象时保持破折号和空格不变,您需要从笔的 DashPattern 数字中删除缩放。

这是一个例子:

e.Graphics.DrawLine(pen1, 0, 40, 600, 40);  // black line

float scale = 2.5f;

e.Graphics.ResetTransform();
e.Graphics.ScaleTransform(scale, scale);

pen2.DashPattern = pen2.DashPattern.Select(x => x / scale).ToArray();

e.Graphics.DrawLine(pen2, 0, 30, 600, 30);  // pink line

结果

不需要缩放笔,除非你也想从宽度中删除缩放,顺便说一句!但是如果你想保持宽度不变,你也需要按 1f/scale 缩放;您的代码使其与 Graphics.ScaleTransform 的方向相同,这将使效果倍增!