Windows forms рисование мышью
Вы когда-нибудь слышали о программах САПР? А о графических редакторах? Так вот, программа Scribble не относится ни к тем, ни к другим.
На первый взгляд, программа работает просто замечательно. Вы наводите курсор на клиентскую область программы, нажимаете левую кнопку мыши и перемещаете ее, рисуя прямые, кривые и другие замысловатые линии. (Поскольку здесь используется простой подход с отслеживанием мыши, принцип работы этой программы не слишком сложен.) Рисование происходит во время исполнения метода OnMouseMove; программа получает от CreateGraphics объект Graphics и просто соединяет линией новую позицию мыши с предыдущей (которая сохранена в поле ptLast). Здесь я отдал дань уважения ранней рекламе Apple Macintosh:
Но что делает Scribble при исполнении метода OnPaint? Ой. кажется, программа забыла сохранить позиции мыши, использованные для рисования линий. Если понадобится перерисовать клиентскую область, ничего не выйдет.
Есть пара способов реализации механизма повторной прорисовки в подобной программе. Например, использовать теневой растр (shadow bitmap), который программа рисует одновременно с рисунком на экране. При исполнении метода OnPaint программа просто покажет это изображение. Это делает другая версия программы, которую вы увидите в главе 11, а в главе 15 я сохраню точки при помощи графических контуров.
Другое решение — накопить массив структур Point, после чего во время исполнения метода OnPaint просто вызвать DrawLines. Но при этом встает ряд вопросов. Число элементов, которое может хранить массив в С#, фиксировано и определяется при создании массива. Есть соблазн создать большой массив для хранения множества точек, как в этом примере:
Но при этом мы осложним себе жизнь двумя опасениями: во-первых, выделенных точек может оказаться недостаточно для какого-нибудь искусного художника, во-вторых, мы понапрасну теряем много памяти.
Решение — в классе ArrayList, определенном в пространстве имен System.Collections, которое включает также классы с аппетитными для программиста именами — Queue, Stack, SortedList и Hashtable. Объект ArrayList похож на одномерный массив, расширяющийся по мере необходимости. Здесь я не могу обсудить ArrayList в деталях, но дам основы, а остальное вы выясните сами.
Начать следует с создания нового объекта ArrayList:
Альтернативный конструктор создает массив первоначальной емкости. По умолчанию она равна 16. Затем при помощи метода Add можно добавлять к ArrayList любые объекты. Вот инструкция, добавляющая объект Point:
Аналогичные методы позволяют также вставлять и удалять элементы.
Один из подходов, удобных для извлечения объекта из ArrayList, — использование индексатора, что во многом напоминает извлечение данных из массива. Например, если известно, что четвертый элемент arrlst — это структура Point, ее можно получить так:
Здесь необходимо приведение типа, поскольку индексатор возвращает объект типа Object.
В один и тот же массив-список можно добавлять объекты различных типов. Например, сразу за структурой Point можно добавить Rectangle:
Однако может понадобиться копировать содержимое массива-списка в обычный массив (чуть ниже я это покажу). Если попытаться скопировать объект Rectangle в массив структур Point, возникает ошибка времени выполнения.
Свойство Capacity массива-списка указывает текущее число элементов, которое он способен хранить. По мере добавления (и удаления) объектов свойство Count массива-списка указывает текущее число хранящихся в нем объектов. Значение Count всегда меньше или равно значению Capacity. Если при добавлении элемента значения Count и Capacity равны, то значение Capacity удваивается.
Версия программы Scribble , использующая класс ArrayList, не сможет обойтись одним массивом-списком для хранения всех структур Point. Наличие единственного массива-списка для хранения структур предполагает, что все точки будут соединены в одну линию. Однако пользователь может нарисовать и несколько кривых, всякий раз нажимая левую кнопку мыши и отпуская ее после рисования. Первый объект ArrayList потребуется для сохранения точек по мере их рисования. Когда кнопка мыши отпущена, набор точек следует преобразовать в массив структур Point, и каждый полученный таким образом массив структур Point надо сохранить во втором объекте ArrayList.
В программе ScribbleWithSave главным объектом ArrayList (хранящим массивы Point) является поле arrlstApts. Поле arrlstPts служит для сохранения всех точек в наборе по мере их рисования.
Каждый раз, когда пользователь нажимает левую кнопку и программа получает вызов OnMouseDown, создается новый объект ArrayList. Первый член объекта ArrayList будет описывать текущую позицию курсора мыши в тот момент:
Далее при каждом вызове OnMouseMove программа добавляет дополнительные точки.
Получив вызов OnMouseUp, программа преобразует набор структур Point в массив Point при помощи метода ToArray:
(Здесь используется перегруженная версия метода ToArray, не требующая аргументов. При отсутствии аргумента возвращается массив с элементами типа Object, а если аргумент задан — объект типа Array.) Затем полученный массив Point добавляется к arrlstApts:
Что здесь действительно красиво, так это метод OnPaint. Он просто обрабатывает в цикле все элементы arrlstApts, преобразуя каждый из них в массив Point, который затем передается методу DrawLines. (He думаю, что здесь так уж необходимо выводить линии, хранимые в arrlstPts, но соответствующий код легко добавить.)
Конечно, ScribbleWithSave не может сохранить бесконечное число точек — когда-то просто закончится свободная память. Чтобы защитить программу от подобной ситуации, надо поместить вызов метода Add объекта ArrayList в блок try. Но я не знаю, как проверить такую ситуацию, так как она возникнет лишь после того, как будет нарисовано очень много фигур.
Windows forms рисование мышью
БлогNot. Visual C++: рисуем мышью на форме
Visual C++: рисуем мышью на форме
Предыдущая заметка по теме была вот здесь, а дальше легко найти по цепочке 🙂 Тем не менее, простого примера на рисование мышкой «как в Paint» что-то не видно, попробуем сделать его прямо сейчас.
1. Рисовать будем непосредственно на канве формы, хотя вообще-то лучше на PictureBox , растянутом на всю форму. Тогда просто получите MyGraphics от этого PictureBox . В классе формы приложения Windows Forms пропишем нужные данные:
На событие загрузки формы (Load) проинициализируем данные:
По событию MouseDown формы (нажатие кнопки мыши) будем разрешать рисование:
а по событию MouseUp (отпускание кнопки мыши) — запрещать:
По событию. «движение мыши» формы (MouseMove) будем рисовать, если включён флажок isPaint и текущие координаты мыши отличаются от последних координат, сохранённых в переменной p . Также запомним новые координаты:
Вместо точки мы здесь выводим эллипс 2×2 пиксела. Работать с массивами отдельных пикселов можно, например, через System::Windows::Media::Imaging::WriteableBitmap.
Очищать рисунок можно по любому удобному событию или выбору кнопки (пункта меню). Используем для этого двойной щелчок (MouseDoubleClick) по форме:
2. Увы, при быстром движении мыши обработчик события MouseMove не будет успевать рисовать маленькие эллипсы и линия получится разрывной. Проще всего решить проблему, соединяя текущую точку p и точку, полученную из текущего положения мыши, линией.
Вот как изменится весь написанный нами код:
3. Наконец, существует удобный способ рисования, связанный с классом System::Drawing::Drawing2D::GraphicsPath.
Ниже прилагается полный листинг для вставки в приложение Windows Forms. Его внимательный анализ поможет вам освоить и этот способ. Кроме того, здесь MouseDown различает кнопки мыши, MouseUp определяет число кликов, а MouseMove можно заставить рисовать «непрерывно», раскомментарив одну строчку.
15.11.2016, 14:54; рейтинг: 5714
Рисование с нажатой кнопкой мыши
Всем привет!
Накодил по книге с MSDN такую штуку. Провозился целый день с такой идеей, как сделать так, чтобы событие с рисованием начиналось с нажатия левой кнопки мыши и продолжалось только до тех пор, пока она нажата (или, к примеру, при нажатии клавиши «Space»). Не получается, никак не догоню как.
Как отследить вход в PictureBox курсора мыши с нажатой левой кнопкой
Проблема такая. Необходимо сделать так, чтобы PictureBox меняла картинку при входе курсора мыши с.
Рисование фигур на форме в зависимости от нажатой клавиши
Создайте приложение с двумя формами, в котором на первой (главной) форме выводится сообщение «Нажми.
Событие мыши Mouse Down и получение координат при нажатой кнопке
день добрый, подскажите пожалуйста, как сделать так, что бы при нажатой кнопке мыши в области.
MouseMove при нажатой правой кнопке мыши и рамки в PictureBox
Как избежать изменения действия события pictureBox1_MouseMove при смене рамки изображения внутри.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
DataGridView выделение правой кнопкой мыши
Есть dataGridView1. У него есть свой contextMenuStrip1. При щелчке по невыделенной записи (стоит.
Клик правой кнопкой мыши по кнопке
Как вызвать событие клик правой кнопкой мыши по кнопке? private void btnCancel_MouseClick(object.
Cобытие MouseMove при нажатой левой кнопке мыши
Сделал у PictureBox событие MouseMove. Если просто провести мышкой над PictureBox все срабатывает.
Держать мышку в одном положении при нажатой левой клавише мыши
Нужен код для копки, который будет запускать программу которая в свою очередь будет держать мышку в.
Рисование прямоугольника в pictureBox мышью
Всем привет! У меня вот такая проблема.. на форме размещен pictureBox и нужно нарисовать, используя события мыши прямоугольник. Дело в том что DrawRectangle рисует только вниз и в право, а нужно чтобы прямоугольник рисовался во все стороны. В общем то рисование прямоугольника вверх лево реализовать удалось а на остальное мозгов не хватило . Пожалуйста момогите помогите!!
Рисование прямоугольника мышью: фон PictureBox становится черным
Всё просто. необходимо мышью нарисовать прямоугольник на picturebox Прямоугольник рисуется, но.
Рисование круга мышью на PictureBox
Доброго времени суток, в ходе обучения возник вопрос «а как сделать круг» из имеющиеся функции.
Рисование прямоугольника на picturebox
На форме находится picturebox, на котором нужно нарисовать прямоугольник. В метод Draw с помощью.
Рисование прямоугольника на PictureBox с помощью мыши
Добрый день. Можете подсказать элементарное рисование на PictureBox прямоугольника мышью. Заранее.
Все остальные события для MouseMove,MouseDown,MouseUp,pictureBox_Paint делаю в точности, как у вас.
При этом прямоугольник, все равно рисуется даже без нажатия кнопки.
Пробовала сделать так:
Ну в общем то поспрашивал у своих коллег и решил проблему.. скинул тут код:
тут задаются начальные координаты:
Дело в том что при рисовании вверх право и вниз лево возникали некие несоответствия при подщете координат, т.е какие то из x,y или х0,у0 становились отрицательными, но все помогло исправить функция Math.Abs();
Прошу прощение что так поздно отвечаю! Но лучше поздно, чем никогда
Тут определение переменных:
Петррр, такой вопрос. А если поместить в picturebox картинку, у которой размер подогнан под размер picturebox-а (что-то вроде отмасштабирована), то как можно узнать (пересчитать) начальную и конечную точки прямоугольника?
Т.е. после рисования прямоугольника моя программа должна будет вставить некий объект в файл, а чтобы получить область вставки и не перекрыть уже существующие объекты, как раз и хочу воспользоваться вашим методом рисования на превьюшке, для получения начальной и конечной точки области.
Спасибо.
Рисование прямоугольника на PictureBox с помощью мыши
Рисование прямоугольника на picturebox
На форме находится picturebox, на котором нужно нарисовать прямоугольник. В метод Draw с помощью.
Рисование прямоугольника с помощью мыши — прерывание
Вот цель работы: Рисование прямоугольника с помощью мыши. Координаты левой верхней вершины.
Рисование линии на PictureBox с помощью мыши
Помогите составить пожалуйста!=)Заранее благодарен!! Составить программу решения задачи. Форма.
Рисование прямоугольника в pictureBox мышью
Всем привет! У меня вот такая проблема.. на форме размещен pictureBox и нужно нарисовать.
Вложения
lab1KG.zip (295.3 Кб, 38 просмотров) |
или попросту воспользуйся методом
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Рисование прямоугольника мышью: фон PictureBox становится черным
Всё просто. необходимо мышью нарисовать прямоугольник на picturebox Прямоугольник рисуется, но.
Рисование прямоугольника в графическом окне по двум кликам мыши
Задача такова: при нажатии правой клавиши миши первый раз должны записатся её координаты на экране.
Рисование прямоугольника курсором мыши: как избавиться от красных линий
Во общем есть кус кода ,по клику на форме передаются координаты левого угла прямоугольника,размеры.
Рисование картинок на picturebox по щелчку мыши
Здравствуйте, нужно сделать так, чтобы на picturebox при каждом нажатии мыши рисовалась картинка. В.