Sergey Alexandrovich Kryukov
Это достаточно просто. Есть два несвязанных аспекта, которые вы должны объединить: 1) обработка событий клавиатуры и мыши и проверка состояния клавиатуры; 2) преобразование графики. Вам нужно собрать их вместе.
Прежде всего, вам нужно справиться с этим событием MouseWheel
или переопределить виртуальный метод OnMouseWheel
для управления вам нужно реагировать на колесико мыши:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1[^],
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onmousewheel.aspx[^],
http://msdn.microsoft.com/en-us/library/system.windows.forms.mouseeventargs.aspx[^].
Обратите внимание, что аргументы события дают вам информацию о значении, прокручиваемом колесом в свойстве Delta
.
В коде обработчика также нужно проверить, нажата ли клавиша Ctrl. Возможно, Вам также потребуется проверить, есть ли какие-то другие модификатор клавиши, такие как Alt или Shift, являются нет прессованный. Однако вам не нужно проверять каждый ключ. Вместо этого переопределить виртуальные методы OnKeyDown
и OnKeyUp
или справиться с событиями KeyDown
и OnKeyUp
который будет реагировать на все ключевые события. В каждом случае для каждой клавиши состояние клавиш-модификаторов может быть изменено, а может и не изменяться. Текущее состояние таких ключей передается вам в аргументах события в значении свойства Modifiers
:
http://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.aspx[^],
http://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.modifiers.aspx[^].
Сохраните это значение для каждого события и проверьте последнее состояние модификатора в обработчике события колеса мыши. Если нажата клавиша Ctrl (а возможно, и другие клавиши-модификаторы), выполните масштабирование.
Теперь, собственно зум. Это действительно зависит от того, что представляет собой ваша графика и как вы ее визуализируете. Если вы пытаетесь работать с PictureBox
, это может быть растровое изображение, которое на самом деле не должно быть увеличено с увеличением: оно будет производить неприемлемое качество, пикселляцию. Вы можете только уменьшить размер с приемлемым качеством или даже увеличить, но только немного. Вы все еще можете это сделать, если ваши фактические растровые данные подготовлены к максимально возможному размеру, поэтому во всех масштабах они могут быть только уменьшены в размере.
Однако я не знаю, может быть, ваши данные на самом деле являются векторными, и вы просто визуализируете их на PictureBox
по той же странной причине (что на самом деле является обычной большой ошибкой многих новичков). Тогда вы можете получить идеальную графику в любом масштабе, только вам следует избавиться от PictureBox
, даже если вы действительно используете какое-то растровое изображение. Вместо этого вы должны непосредственно визуализировать свою графику на каком-либо элементе управления (включая Form
), через переопределение виртуального метода OnPaint
или обработка события Paint
:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpaint.aspx[^],
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.paint.aspx[^].
Ваш метод рендеринга должен зависеть от некоторых данных, которые вы храните в поле(полях) вашего класса, включая коэффициент масштабирования. Когда вы меняете масштаб (или что-то еще), вы вызываете один из Invalidate
методы, вызывающие перерисовку:
http://msdn.microsoft.com/en-us/library/598t492a.aspx[^],
http://msdn.microsoft.com/en-us/library/xz8ytzt0.aspx[^],
http://msdn.microsoft.com/en-us/library/8dtk06x2.aspx[^],
http://msdn.microsoft.com/en-us/library/wtzka3b5.aspx[^].
Если это не растровое изображение, вам не нужно пересчитывать всю графику, используя коэффициент масштабирования. Вы должны лучше использовать собственность System.Drawing.Graphics.Transform
:
http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx[^],
http://msdn.microsoft.com/en-us/library/system.drawing.graphics.transform.aspx[^].
Экземпляр класса System.Drawing.Graphics
будет передан вашему обработчику рисования в аргументах события.
Если вы хотите понять почему PictureBox
это так плохо для этой цели, пожалуйста, смотрите мои прошлые ответы:
Добавьте картинку в picturebox[^],
Нарисуйте прямоугольник В C#[^],
Как очистить панель от старого рисунка[^].
На GDI+ для отрисовки и признание их недействительными, также смотрите мои прошлые ответы:
Что же это за игривый метод-рисовать? (DataGridViewImageCell.Красить(...))[
Ron Beyer
Хорошо поставленные и хорошие рекомендации, +5.