Vb net масштабирование с учетом позиции мыши
Поскольку мышь (крыса) является главным орудием юзера, нам надо предоставить ему все возможности для пользования им в мирных целях. Но прежде, чем начать мучать крысу, поговорим о том, что считалось само собой разумеющимся и как-бы не требующим особых пояснений. Это события.
Теперь перейдем к тем событиям, которые вызываются гнусным воздействием юзера на мышь.
Private Sub объект_MouseMove ([индекс As Integer,] клавиша As Integer, shift As Integer, x As Single, y As Single) Private Sub объект_MouseDown ([индекс As Integer,] клавиша As Integer, shift As Integer, x As Single, y As Single) Индекс и возвратит номер элемента массива. | |
Private Sub объект_DblClick() | Возникает при двойном щелчке клавиши мыши, при нахождении курсора мыши над объектом. |
Private Sub объект_DblClick (индекс As Integer). | Аналогичен событию _Click. |
Рисунок 25.
‘Объявим пару переменных для записи пометок в лейблах
Option Explicit
Dim ValButton As String
Dim ValShift As String
Label2.Caption = «Значение Button= » & Button & ValButton
Label2.Caption = «Значение Button= » & Button & ValButton
Рисование фигур программными методами.
Теперь я скажу, что рисовать такие фигуры, как круг, овал, прямоугольник, линия можно не только с помощью объекта Shape, но и программно, путем написания операторов. Это очень просто.
объект .Line [Step] (x1, y1) [Step] (x2, y2), [color], [B][F]
Где
Таким образом, чтобы нарисовать линию, например, в объекте Picture1, можно использовать такой код:
Private Sub Form_Load()
‘задаем единицы измерения пиксели
Picture1.ScaleMode = vbPixels
‘устанавливаем свойство AutoRedraw в True, а то нашего рисования видно не будет
Picture1.AutoRedraw = True
‘ширину лини устанавливаем в 3 пикселя
Picture1.DrawWidth = 3
‘ставим цвет в свойстве ForeColor в фиолетовый
Picture1.ForeColor = &HFF00FF
‘рисум линию с начальной координатой X1=10, Y1=10 и конечной X2=150, Y2=150 пикселей
‘поскольку цвет не задаем, линия будет фиолетовой по свойству ForeColor
Picture1. Line Step(10, 10)-(150, 150)
End Sub
Ключевое слово Step можно использовать, если нужно привязаться к постоянно меняющимся значениям свойств .CurrentX и .CurrentY. Так, например, мы можем нарисовать наш квадратик там, куда щелкнем мышкой.
Private Sub Form_Load()
Picture1.ScaleMode = vbPixels
Picture1.AutoRedraw = True
Picture1.DrawWidth = 3
Picture1.ForeColor = &HFF00FF
End Sub
объект.Circle [Step] (x, y), радиус, [color, start, end, aspect],
Где
Ну-с, опять в нашем Picture1 рисуем окружность. Все происходит аналогично методу .Line
Private Sub Form_Load()
Picture1.ScaleMode = vbPixels
Picture1.AutoRedraw = True
Picture1.DrawWidth = 3
Picture1.ForeColor = &HFF00FF
Picture1. Circle (200, 120), 70
End Sub
А вот пример маленького кода, где мы можем использовать «мышиные» события и рисование фигур. Эта программка рисует окружность, причем радиус и положение задается нажатием клавиши мыши. Когда клавиша отпускается, окружность фиксируется.
Автоматическое масштабирование в Windows Forms
Потребность в автоматическом масштабировании
Без автоматического масштабирования приложения, разработанные для определенного разрешения экрана или шрифта, будут выглядеть либо слишком маленькими, либо слишком большими при изменении разрешения или шрифта. Например, если приложение разработано с использованием базового шрифта Tahoma размером 9 пунктов, то без коррекции оно будет выглядеть слишком маленьким при запуске на компьютере, на котором в качестве системного шрифта используется Tahoma размером 12 пунктов. Текстовые элементы, такие как заголовки, меню, содержимое текстовых полей и т. д., будут меньше, чем в других приложениях. Более того, размер содержащих текст элементов пользовательского интерфейса, таких как строки заголовков, меню и т. д., зависит от используемого шрифта. В рассматриваемом примере эти элементы также будут выглядеть относительно меньше.
Аналогичная ситуация возникает, когда приложение разработано для определенного разрешения экрана. Наиболее распространенное разрешение экрана — 96 точек на дюйм (DPI), что соответствует 100 % масштабирования экрана, однако все более распространенными становятся более высокие разрешения, включая 125 %, 150 %, 200 % (что соответствует 120, 144 и 192 DPI) и выше. Без коррекции приложение, особенно графическое, разработанное для одного разрешения, будет отображаться либо слишком большим, либо слишком маленьким при запуске с другим разрешением.
Исходная поддержка автоматического масштабирования
Во время разработки свойству AutoScaleBaseSize (которое теперь устарело) присваивалась высота и ширина системного шрифта по умолчанию на компьютере разработчика.
Во время выполнения для инициализации свойства Font класса Form использовался стандартный системный шрифт компьютера пользователя.
Перед отображением формы вызывался метод ApplyAutoScaling для ее масштабирования. Этот метод вычислял относительный масштаб с помощью свойств AutoScaleBaseSize и Font, а затем вызывал метод Scale для масштабирования формы и ее дочерних элементов.
Значение свойства AutoScaleBaseSize обновлялось таким образом, чтобы последующие вызовы ApplyAutoScaling не продолжали изменять размер формы.
Этого механизма было достаточно для большинства целей, но он имел ряд ограничений.
Так как AutoScaleBaseSize свойство представляет базовый размер шрифта как целочисленные значения, возникают ошибки округления, которые становятся очевидными, когда форма циклически проходит несколько разрешений.
Автоматическое масштабирование было реализовано только в классе Form, но не в классе ContainerControl. В результате пользовательский элемент управления масштабировался корректно, только если он был разработан с тем же разрешением, что и форма, и был помещен в форму во время разработки.
Несколько разработчиков могли параллельно разрабатывать формы и их дочерние элементы управления, только если разрешение экрана на их компьютерах совпадало. Аналогичным образом наследование форм зависело от разрешения родительской формы.
Текущая поддержка автоматического масштабирования
Базовая поддержка масштабирования была перемещена в класс ContainerControl, чтобы формы, собственные составные элементы управления и пользовательские элементы управления получали единообразную поддержку масштабирования. Были добавлены новые члены AutoScaleFactor, AutoScaleDimensions, AutoScaleMode и PerformAutoScale.
Класс Control также имеет несколько новых членов, которые позволяют ему участвовать в масштабировании и поддерживать смешанное масштабирование в одной и той же форме. В частности, члены Scale, ScaleChildren и GetScaledBounds поддерживают масштабирование.
В реализацию автоматического масштабирования была добавлена совместимость с диспетчерами макетов, такими как FlowLayoutPanel и TableLayoutPanel.
Коэффициенты масштабирования теперь представляются в виде чисел с плавающей запятой, обычно с помощью структуры SizeF, что позволило практически устранить ошибки округления.
Произвольные сочетания режимов масштабирования на основе разрешения экрана и размера шрифта не поддерживаются. Вы без всяких проблем можете масштабировать пользовательский элемент управления в одном режиме (например, на основе разрешения экрана) и поместить его в форму с помощью другого режима (на основе размера шрифта), но использование базовой формы в одном режиме и производной формы в другом может привести к непредвиденным результатам.
Автоматическое масштабирование в действии
В Windows Forms для автоматического масштабирования формы и ее содержимого теперь используется описанная ниже логика.
Во время разработки каждый объект ContainerControl регистрирует режим масштабирования и его текущее разрешение в свойствах AutoScaleMode и AutoScaleDimensions соответственно.
Во время выполнения фактическое разрешение хранится в свойстве CurrentAutoScaleDimensions. Свойство AutoScaleFactor динамически вычисляет отношение между разрешением во время выполнения и разрешением во время разработки.
Если при загрузке формы значения CurrentAutoScaleDimensions и AutoScaleDimensions различны, то для масштабирования элемента управления и его дочерних элементов вызывается метод PerformAutoScale. Этот метод приостанавливает размещение и вызывает метод Scale для выполнения фактического масштабирования. Впоследствии значение AutoScaleDimensions обновляется во избежание прогрессивного масштабирования.
Метод PerformAutoScale также вызывается автоматически в перечисленных ниже ситуациях.
В ответ на событие OnFontChanged, если используется режим масштабирования Font.
Если при возобновлении размещения элементов управления внутри контейнера обнаруживается изменение свойства AutoScaleDimensions или AutoScaleMode.
При масштабировании родительского объекта ContainerControl, как указанно выше. Каждый контейнерный элемент управления отвечает за масштабирование своих дочерних элементов с помощью своих собственных коэффициентов масштабирования, а не коэффициентов его родительского контейнера.
Поведение дочерних элементов управления при масштабировании может изменяться несколькими способами.
Можно переопределить свойство ScaleChildren, чтобы указать, следует ли масштабировать дочерние элементы управления.
Можно переопределить метод GetScaledBounds для корректировки границ, до которых масштабируется элемент управления, но не логики масштабирования.
Можно переопределить метод ScaleControl для изменения логики масштабирования текущего элемента управления.
Как можно сделать масштабирование изображения на PictureBox?
Масштабирование изображения в PictureBox
Вот код: public partial class FormIMP : Form < OpenFileDialog OFD = new.
Масштабирование изображения в PictureBox
Подскажите, как реализовать масштабирование получаемой картинки по размеру PictureBox. Каждый.
Масштабирование и прокрутка изображения в PictureBox
Здравствуйте уважаемые) Пожалуйста, помогите подружить два кода найденные на этом форуме. У меня.
Как можно сделать так, чтобы в PictureBox, можно было работать по экранным координатам(т.е. по пикселям)?
Как можно сделать так, чтобы в PictureBox, можно было работать по экранным координатам(т.е. по.
Как вариант сглаживание правда не знаю как убрать
Решение
Yury Komar, у Вас картинка будет масштабироваться каждый раз, и каждый раз будет ухудшаться ее качество.
Можно сделать свой контрол на основе PictureBox или UserControl.
Yanik1987, как вариант можно не делать повторное масшиабирование, а вычислять конечный размер картинки после прокрутки и применять к вновь загруженному, например из файла или ресурсов и тогда качество не будет страдать при каждом изменении размера.
Vb.net масштабирование picturebox
Я пытаюсь в какой-то степени воспроизвести windows photo viewer.
Прямо сейчас у меня есть форма с picturebox и возможностью перемещать ее с помощью мыши и увеличивать/уменьшать масштаб с помощью колеса прокрутки.
Однако я хочу приблизиться к указателю мыши. Вы можете увидеть то, что я пытаюсь объяснить, открыв прилично большое изображение в windows Photo viewer и увеличив масштаб с помощью мыши где-то вдали от центра изображения. Я хочу повторить это, но пока могу только увеличивать и уменьшать масштаб.
Я знаю, что мне нужно переместить изображение в направлении, противоположном направлению указателя мыши к центру формы, и варьировать, насколько оно перемещается за тик колеса прокрутки, в зависимости от того, как далеко ваша мышь находится от центра формы, но именно здесь я застрял.
Вот мой смехотворный, запутанный кусок кода, который наполовину закомментирован и наполовину не работает и полностью не работает:
это делает в значительной степени именно то, что я хочу (если вы нажмете «Open Zoomable Image» при запуске этой формы, однако я не могу точно понять, как это работает: http:/ / www.vbforums.com/showthread. php?654846-ZoomPictureBox-picture-control-with-mouse-centred-zooming
1 ответ
Что такое более легкий элемент управления, этикетка или picturebox? (метка также может содержать изображение). У меня будет форма со 110 значками, отображаемыми в отдельных элементах управления, и я решаю, должен ли я отображать их в pictureboxes или в labels. В VB6 был элемент управления.
Мне просто интересно, как я могу создать массив picturebox, как это было, когда я скопировал и вставил другой picturebox в VB6, и он спросил меня, хочу ли я добавить их в массив. Это заставило их кодировать так: picBox(0).enabled = true picBox(1).enabled = true etc etc.. Но я не могу сделать это с.
А затем измените размер PictureBox, как вы хотите.
Вы можете определить положение мыши в форме, добавив событие MouseMove в форму и сохранив положение в переменной. Или вы можете получить положение мыши на экране в любой момент с помощью:
Похожие вопросы:
У меня есть перенесенный проект, который содержит PictureBox Events.When он перенесен в VB.NET 2008 некоторые события преобразуются, которые не являются правильными. Потому что PictureBox в VB.NET.
Вопрос: Как я могу реализовать масштабирование текущего положения мыши над picturebox, что-то вроде масштабирования в Google Maps? Я разрабатываю простой движок GIS / map в качестве своей дипломной.
Я использую приложение VB.NET forms, и мне нужно проверить, есть ли в нем изображение PictureBox в настоящее время. Как бы я это сделал? Спасибо
Что такое более легкий элемент управления, этикетка или picturebox? (метка также может содержать изображение). У меня будет форма со 110 значками, отображаемыми в отдельных элементах управления, и я.
Мне просто интересно, как я могу создать массив picturebox, как это было, когда я скопировал и вставил другой picturebox в VB6, и он спросил меня, хочу ли я добавить их в массив. Это заставило их.
У меня есть два pictureboxes в моем приложении: один, который в основном является просто фоновым изображением, и другой, который вы можете перемещать, изменяя некоторые настройки. Однако, в.
Я хотел бы знать, как создать эффект увеличительного стекла для picturebox. Не масштабирование picturebox, а увеличение части изображения в элементе управления PictureBox (круг или прямоугольник) и.
Как я могу нарисовать на изображении picturebox с помощью мыши в vb.net линию или кисть?
Я пишу программу карточной игры в VB.NET. Я столкнулся с проблемой. Computer_Flow объявляется как System.Windows.Forms.Panel вручную в окне дизайна. Я создал такую коробку с картинками программно.
Кажется, я не могу программно создать цветной bitmap для отображения в PictureBox. bitmap обычно сохраняется в виде файла, но при отображении в PictureBox исчезает по краям. Вот упрощенный код.
Изменение размера контрола вместе с формой
Изменение размера формы и области вместе с ней.
Подскажите в чём может быть проблема. У меня есть форма на которой расположена область класса.
Изменение размера элементов вместе с формой (Anchor, Dock)
Привет, я хотел бы чтобы размер элементов на форме пропорционально менялся вместе с формой. Но.
Динамическое изменение размеров элементов управления вместе с формой
Подскажите как привязать элементы управления к форме, чтобы при растягивании (изменении размера).
Да вот с ним-то я и не могу разобраться. Куда его вписывать? Какое свойство ему присваивать? Дайте небольшой примерчик.
Добавлено через 3 минуты
Поставил
получается только для права и лева. а вот верх и низ как сделать?
Добавлено через 5 минут
И получается всё-равно что-то не то. Разобрался с верхом-низом, НО ставлю на форму Label, TextBox, Button, WebBowser. Изменяет не правильно. Т.е. при уменьшении формы кнопка вообще пропадает, а при увеличении формы Броузер залазиет на кнопку.
Добавлено через 2 минуты
Всё! Разобрался, правда не совсем пока догнал, почему если у кнопки убрать Top и Left, то всё заработало: