我正在使用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));
}
对笔进行了变换,以使宽度在不同的缩放级别上保持恒定,但是虚线之间的间距仍然会改变。
有没有办法使它们保持恒定而与缩放无关?
答案 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
结果
无需缩放笔,除非您也想从宽度上删除缩放比例,顺便说一句!但是,如果要保持宽度不变,则还需要按1f/scale
进行缩放;您的代码具有与Graphics.ScaleTransform
相同的方向,它将使效果成倍增加!