С# Масштабирование нарисованого на PictureBox (SizeMode - Zoom)

245
16 января 2018, 10:29

Я рисую Rectangle на PictureBox у которого SizeMode = Zoom. Как мне при изменении размеров PictureBox, изменять размер и позицию Rectangle? Как применить Zoom к Rectangle? Как получить новые координаты и размер? Проект winforms.

private void box_Paint(object sender, PaintEventArgs e) {
  foreach (Marker marker in markers) {
    using (var brush = new SolidBrush(Color.Red) {
      e.Graphics.FillRectangle(brush, marker.getZone());
    }
  }
}

Мне нужно записывать координаты относительно PictureBox.Image.Size?

Answer 1

Прежде всего, нужно определить для каких размеров PictureBox заданы размеры маркеров, которые вы рисуете.

Если, например, маркеры задаются перед показом PictureBox и никогда не меняются, то начальные размеры PictureBox можно считать опорной точкой. Для этого их необходимо сохранить в переменную.

При изменении размеров PictureBox, у нас получаются две пропорции:

old_picturebox_width/new_picturebox_width=marker_width/rectangle_width
old_picturebox_height/new_picturebox_height=marker_height/rectangle_height

Таким образом, чтобы определить факторы, на который следует умножать оригинальные ширину и высоту маркера, надо всего лишь разделить оригинальные ширину и высоту PictureBox на его текущие ширину и высоту (и не забыть проверку на ноль; если ноль - делить нельзя, но и рисовать слава богу тоже не надо).

Если маркеры задаются пользователем (то есть изменяются), тогда лучше поступить по другому. Вычислять размеры маркеров нужно не непосредственно перед их отрисовкой, а сразу после изменения размеров PictureBox. Для этого, надо запоминать предыдущие размеры PictureBox, при изменении размеров заменять предыдущие маркеры вновь посчитанными с учетом пропорции, и запоминать текущие размеры PictureBox, чтобы использовать их когда размеры PictureBox изменятся снова.

READ ALSO
Проблема с скриптом при запуске игры

Проблема с скриптом при запуске игры

Из-за чего может быть следующее: скрипт висит на объекте, при старте сцены он выключается ? то есть enable = false, манипуляции с активностью скрипта...

221
Instantiate создает множество копий объекта Unity3D

Instantiate создает множество копий объекта Unity3D

Добрый деньВозникла проблема с Unity3D, пытаюсь создать копию объекта в заданной точке

228
Как получить отрендеренное изображение image Control-а WPF?

Как получить отрендеренное изображение image Control-а WPF?

В xaml создаю изображение и задаю ему нужную высоту:

251
Какие бывают виды абстракций в ООП? [требует правки]

Какие бывают виды абстракций в ООП? [требует правки]

Какие бывают виды абстракций в ООП?

236