缩放时为笔 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
的方向相同,这将使效果倍增!
我正在使用 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
的方向相同,这将使效果倍增!