У меня есть PictureBox (его свойство SizeMode установлено в Zoom), содержащее изображение, и оба могут различаться по размеру.
Поскольку пользователь должен напрямую взаимодействовать с изображением, я должен иметь возможность преобразовывать координаты щелчка PictureBox в координаты изображения.
То, что я сделал до сих пор, это сравните соотношение сторон PictureBox и соотношение сторон изображения. Например, если PictureBox «более широкоэкранный» по отношению к изображению (см. Скриншот), это означает, что PictureBox растянет изображение до его собственной высоты и отцентрирует его по горизонтали, показывая его цвет фона (в данном случае красный) к слева и справа от изображения. Затем я предполагаю, что отображаемая высота изображения такая же, как PictureBox.Height, и работаю оттуда.
Хотя есть проблема. Как вы можете видеть на скриншоте (зеленая пометка), белое изображение растягивается, чтобы поместиться (увеличено) внутри красного PictureBox, оставляя небольшое поле внизу.
screenie http://img132.imageshack.us/img132/3541/bordernl6.th.png Нажмите для увеличения.
Однако это происходит не для всех комбинаций PictureBox.Size / Image.Size. Это заставляет меня верить, что должен быть лучший способ сделать это.
Конечно, я сделаю это. Мне просто нужно адаптировать код для удаления зависимости контекста.
Но поле внизу не исходит из моего кода. Это происходит от самого PictureBox. Сделайте мне одолжение и попробуйте следующее:
Добавьте PictureBox (PictureBox1) в форму, закрепите его на всех четырех сторонах формы. Код должен выглядеть следующим образом:
Public Class Form1
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
PictureBox1.BackColor = Color.Red
PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
g.FillRectangle(Brushes.White, 0, 0, PictureBox1.Image.Width, PictureBox1.Image.Height)
End Sub
End Class
Запустите его и измените размер формы так, чтобы изображение растягивалось (увеличивалось), чтобы заполнить высоту PictureBox, оставляя красные полосы слева и справа от белого квадрата. Теперь измените размер формы вертикально, как можно медленнее. Время от времени вы должны видеть красное поле внизу.
То же самое происходит с шириной и горизонтальным изменением размера, показывая поле справа.
Именно из-за этого небольшого несовершенства я знаю, что коэффициент масштабирования не может быть рассчитан так, как я это делал; результат будет только приблизительным. Если, попробовав это, вы по-прежнему считаете код соответствующим, то я с удовольствием выложу его.
Спасибо, что нашли время, чтобы прочитать и ответить.