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

时间:2018-09-24 10:28:47

标签: c# .net gdi+

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

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

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();
}

刷新PictureBox:

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));
}

对笔进行了变换,以使宽度在不同的缩放级别上保持恒定,但是虚线之间的间距仍然会改变。

有没有办法使它们保持恒定而与缩放无关?

2 个答案:

答案 0 :(得分:0)

如果无论刻度如何都需要保持恒定的可视笔大小(宽度和间距),则可以抵消刻度笔的宽度并替换线条:

pen.ScaleTransform(scale, scale);

具有:

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

那样行将一直保持不变。

答案 1 :(得分:0)

要在缩放图形对象时使虚线和空格保持恒定,您需要从笔的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

结果

enter image description here

无需缩放笔,除非您也想从宽度上删除缩放比例,顺便说一句!但是,如果要保持宽度不变,则还需要按1f/scale进行缩放;您的代码具有与Graphics.ScaleTransform相同的方向,它将使效果成倍增加!