matimont Ответов: 1

Масштабирование изображения в колесе мыши C# .net


Привет,

У меня есть picturebox, где я загружаю изображение, а затем я хотел бы увеличить его, нажав "ctrl"+ движения колесика мыши.

Как я могу выполнить это в C# .net?

Спасибо!

Sergey Alexandrovich Kryukov

Это не имеет ничего общего с PictureBox. Лучше не используйте этот контроль, лучше сделать это самостоятельно. В чем проблема? http://www.whathaveyoutried.com?
—СА

1 Ответов

Рейтинг:
8

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.

Sergey Alexandrovich Kryukov

- Спасибо, Рон.
—СА

Member 10415645

Спасибо

Sergey Alexandrovich Kryukov

Добро пожаловать.
—СА

Maciej Los

5ed!

Sergey Alexandrovich Kryukov

Спасибо, Мацей.
—СА

Marcin Kozub

Отлично, мой 5-й!

Sergey Alexandrovich Kryukov

Спасибо, Марцин.
—СА