Сохраняйте постоянные места для пера DashStyle при масштабировании - PullRequest
0 голосов
/ 24 сентября 2018

Я реализую рисунок на элементе управления в C #, используя класс Graphics.Мне нужно реализовать функцию масштабирования, но я заметил странное поведение для пунктирных линий.Когда я увеличиваю их, пробелы между штрихами меняются, даже если ширина пера не меняется.

Я добавляю пример кода, чтобы нарисовать горизонтальную пунктирную линию в середине 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 голосов
/ 24 сентября 2018

Чтобы сохранить постоянные тире и пробелы при масштабировании графического объекта, вам необходимо удалить масштабирование с чисел 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, который умножит эффект!

0 голосов
/ 24 сентября 2018

Если вам нужно сохранить постоянный размер визуального пера (ширину и пробелы) независимо от масштаба, вы можете противодействовать масштабированию ширины пера и заменить строку:

pen.ScaleTransform(scale, scale);

на:

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

Таким образом, линия будет оставаться неизменной все время.

...