gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:28:38 24 4
gpt4 key购买 nike

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

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

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 会进行变换以在不同的缩放级别下保持宽度不变,但破折号之间的间距仍然会发生变化。

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

最佳答案

要在缩放图形对象时保持破折号和空格不变,您需要从笔的 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 的方向相同,这将使效果成倍增加!

关于c# - 缩放时为笔 DashStyle 保持恒定的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52477357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com