belalugoci 3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
||||
1 |
||||
25.02.2019, 11:32. Показов 12333. Ответов 17 Метки нет (Все метки)
Находил темы и на этом форуме и многие другие, но так и не получилось ничего запустить чтобы работало, то ругается на
то еще что-то. Поэтому спрашиваю рабочие варианты на 2019 год — рисование отдельной точки, незакрашенного квадрата и закрашенного квадрата. Устроит любой вариант с панелью, формой или picturebox.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
25.02.2019, 11:32 |
17 |
19 / 13 / 8 Регистрация: 09.01.2019 Сообщений: 72 |
|
25.02.2019, 11:40 |
2 |
0 |
belalugoci 3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
||||
25.02.2019, 11:46 [ТС] |
3 |
|||
Graphics
Ошибка CS0144 Не удается создать экземпляр абстрактного класса или интерфейса «Image» и открыт вопрос — куда он нарисует? подозреваю не на панель.
0 |
Даценд 5858 / 4735 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||
25.02.2019, 11:57 |
4 |
|||
Рисование на форме:
Для рисования на панели или любом другом элементе нужно подписаться на Paint этого элемента и рисовать в обработчике.
0 |
3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
|
25.02.2019, 12:02 [ТС] |
5 |
Form1_Paint Откуда получена информация что именно так оно называется?
Graphics gr = e.Graphics; как узнаёт что речь про рисование на форме? и как указать чтобы рисовал на панели? Добавлено через 1 минуту
Для рисования на панели или любом другом элементе нужно подписаться на Paint этого элемента и рисовать в обработчике. Ошибка CS0103 Имя «Form1_Paint» не существует в текущем контексте.
0 |
5858 / 4735 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
|
25.02.2019, 12:07 |
6 |
Откуда получена информация что именно так оно называется? Произвольное название. Главное чтобы названия в 4-й и 7-й строках совпадали.
как узнаёт что речь про рисование на форме? Вторым параметром метода Form1_Paint является объект
и как указать чтобы рисовал на панели? Не дочитали?
Для рисования на панели или любом другом элементе нужно подписаться на Paint этого элемента и рисовать в обработчике.
0 |
3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
|
25.02.2019, 12:31 [ТС] |
7 |
Не дочитали? дочитал, для меня там написано «oasihfvervyhaowejgvoaehivhauiowehvojfpwaejvouehru vbhoawejcfpvuoaeh» не понял как просто выбор названия из головы связывает рисование с формой.
Вторым параметром метода Form1_Paint является объект PaintEventArgs e, в который передается дополнительная информация о объекте, на событие которого метод подписан. а эта е откуда знает что она содержит? название вы придумали сами и оно каким-то магическим образом стало однозначно указывать на форму. Если бы я написал Vasya_Paint то откуда оно узнает что речь про панель 10 на форме? почему не 9 или не 3? Добавлено через 6 минут
Не дочитали? комментарий — лучший друг программиста. this.Paint — в данном случае this это форма теперь разобрался. Добавлено через 5 минут
Для рисования на панели я правильно понимаю что в Paint нужно написать универсальный код отрисовки, а через параментры передавать информацию — что именно рисовать. То есть список объектов для отрисовки, так?
0 |
Даценд 5858 / 4735 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||
25.02.2019, 12:34 |
8 |
|||
belalugoci,
Если планируете программировать под WinForms, то советую разобраться с подпиской на события. Последний раз пробую:
0 |
3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
|
25.02.2019, 12:36 [ТС] |
9 |
Для рисования а не будет ли производительнее рисовать только то что изменилось без перерисовки всего остального? или Paint так и работает?
0 |
5858 / 4735 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
|
25.02.2019, 12:39 |
10 |
без перерисовки всего остального? не обойтись
0 |
3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
|
25.02.2019, 12:52 [ТС] |
11 |
У меня нет времени развернуто отвечать на вопросы, разжевывая азы программирования в среде Windows Forms. как вариант — не сидеть на форуме и не отвечать на вопросы совсем — времени будет много.
Я выше посоветовал: зашел по такой ссылке
Последний раз пробую: я уже написал что я разобрался. Добавлено через 8 минут
не обойтись скорость ад, примерно 0,3 fps.
0 |
Фрилансер 803 / 310 / 148 Регистрация: 13.02.2019 Сообщений: 1,071 |
|
26.02.2019, 13:47 |
12 |
скорость ад, примерно 0,3 fps. Так GDI не про высокий fps. Нужен высокий fps, используйте OpenGL или DirectX Добавлено через 3 минуты
0,3 fps Если не секрет, что Вы там такое ужасное рисуете, что отрисовка больше 3-х секунд занимает? Или Вы на калькуляторе рисуете? )))
0 |
3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
|
26.02.2019, 13:58 [ТС] |
13 |
Если не секрет, что Вы там такое ужасное рисуете, что отрисовка больше 3-х секунд занимает? Или Вы на калькуляторе рисуете? ))) время утрирую, считать всё равно нечем, так что на глаз. рисуется матрица из 4096 квадратиков 8х8 разными цветами.
0 |
Фрилансер 803 / 310 / 148 Регистрация: 13.02.2019 Сообщений: 1,071 |
|
26.02.2019, 14:16 |
14 |
считать всё равно нечем Stopwatch?
рисуется матрица из 4096 квадратиков 8х8 разными цветами.
примерно 0,3 fps У меня весь процесс занял 10 мс… Так что насчет 0,3 фпс как то сомнительно)))
0 |
3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
|
26.02.2019, 15:53 [ТС] |
15 |
У меня весь процесс занял 10 мс… Так что насчет 0,3 фпс как то сомнительно))) цель этого разговора? я вижу как рисуется матрица, мне этого достаточно чтобы сказать что это медленно.
Stopwatch? ей богу не понимаю я людей, у одного времени мало, другому заняться нечем. Главное остается неизменным — я в любом случае что-то для кого-то делаю не так.
0 |
Фрилансер 803 / 310 / 148 Регистрация: 13.02.2019 Сообщений: 1,071 |
|
26.02.2019, 16:17 |
16 |
цель этого разговора?
ей богу не понимаю я людей Мда… Комментарии тут излишни… Извините, что посмели высказать свое мнение, которое не совпадает с мнением Вашего Величества! ))) Более не повторится)))
я вижу как рисуется матрица Ну тут всего 2 варианта:
я в любом случае что-то для кого-то делаю не так
2 |
3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
|
26.02.2019, 16:43 [ТС] |
17 |
Извините, что посмели высказать свое мнение Это должно ведь работать в обе стороны? Должно быть ваше мнение и моё мнение, но почему-то вы совсем игнорируете моё мнение и навязываете ваше.
Ну тут всего 2 варианта Есть еще несколько, но вам они ведь не интересны.
0 |
belalugoci 3 / 199 / 22 Регистрация: 01.06.2018 Сообщений: 2,482 |
||||
27.02.2019, 11:21 [ТС] |
18 |
|||
получилось так. Время прорисовки удалось сократить убрав код который считает буфер точек в другую область программы. Сейчас 3 мс на прорисовку, хоть моргание при первом заполнении и видно, но это уже не критично. Миниатюры
1 |
I have an image with the dimensions of 100×50 and I want to draw a dot in the center — i.e. at 50×25. How would I do this?
Mark Hildreth
41.3k11 gold badges119 silver badges108 bronze badges
asked Aug 14, 2012 at 6:10
1
you could use the setPixle() function.
answered Aug 14, 2012 at 6:27
elyashivelyashiv
3,5952 gold badges28 silver badges51 bronze badges
2
Graphics g = pictureBox1.CreateGraphics();
g.DrawEllipse(Pens.Black, new Rectangle(50, 25, 1, 1));
look here for saving the picture
it does not draw on form load so you should add your code in form paint
event :
private void Form1_Paint(object sender, PaintEventArgs e)
{
Application.DoEvents();
Graphics g = pictureBox1.CreateGraphics();
g.DrawEllipse(Pens.DarkBlue, new Rectangle(120, 90, 1, 1));
}
answered Aug 14, 2012 at 6:16
Mahdi TahsildariMahdi Tahsildari
13k14 gold badges54 silver badges94 bronze badges
11
Image img = pictureBox1.Image;
Graphics g = Graphics.FromImage(img);
g.DrawEllipse(Pens.DarkBlue, new Rectangle(50, 25, 1, 1));
g.DrawImage(img, new Point(0, 0));
img.Save("d:\img.Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
answered Aug 14, 2012 at 7:09
Habib ZareHabib Zare
1,1767 silver badges17 bronze badges
7
try this for other question :
Rectangle bounds = new Rectangle(10, 20, 50, 60);
Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
Graphics g = Graphics.FromImage(bitmap);
g.CopyFromScreen(Point.Empty,Point.Empty, bounds.Size);
bitmap.Save("d:\img.Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
this code will capture screen with bound of bounds rectangle.
answered Aug 14, 2012 at 7:31
Habib ZareHabib Zare
1,1767 silver badges17 bronze badges
2
I have an image with the dimensions of 100×50 and I want to draw a dot in the center — i.e. at 50×25. How would I do this?
Mark Hildreth
41.3k11 gold badges119 silver badges108 bronze badges
asked Aug 14, 2012 at 6:10
1
you could use the setPixle() function.
answered Aug 14, 2012 at 6:27
elyashivelyashiv
3,5952 gold badges28 silver badges51 bronze badges
2
Graphics g = pictureBox1.CreateGraphics();
g.DrawEllipse(Pens.Black, new Rectangle(50, 25, 1, 1));
look here for saving the picture
it does not draw on form load so you should add your code in form paint
event :
private void Form1_Paint(object sender, PaintEventArgs e)
{
Application.DoEvents();
Graphics g = pictureBox1.CreateGraphics();
g.DrawEllipse(Pens.DarkBlue, new Rectangle(120, 90, 1, 1));
}
answered Aug 14, 2012 at 6:16
Mahdi TahsildariMahdi Tahsildari
13k14 gold badges54 silver badges94 bronze badges
11
Image img = pictureBox1.Image;
Graphics g = Graphics.FromImage(img);
g.DrawEllipse(Pens.DarkBlue, new Rectangle(50, 25, 1, 1));
g.DrawImage(img, new Point(0, 0));
img.Save("d:\img.Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
answered Aug 14, 2012 at 7:09
Habib ZareHabib Zare
1,1767 silver badges17 bronze badges
7
try this for other question :
Rectangle bounds = new Rectangle(10, 20, 50, 60);
Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
Graphics g = Graphics.FromImage(bitmap);
g.CopyFromScreen(Point.Empty,Point.Empty, bounds.Size);
bitmap.Save("d:\img.Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
this code will capture screen with bound of bounds rectangle.
answered Aug 14, 2012 at 7:31
Habib ZareHabib Zare
1,1767 silver badges17 bronze badges
2
По сути точки будут рисоваться в центре квадратиков на которые будет поделена вся область игрового мира.
Точке в OpenGL можно задать размер это делает функция glPointSize (размер);
Чтобы нарисовать точку нужно вызывать блок команд
glBegin(GL_POINTS);
glVertex2f(координата по X ,координата по Y);
glEnd();
Функция будет принимать 2 координаты на входе и по ним будет строить точку
DrawPointScore
//функция рисования точки
void DrawPointScore(float Start_X, float Start_Y)
{
//включим сглаживание точек
glEnable(GL_POINT_SMOOTH );
float
dx = 0.08f, //ширина квадрата
dy = 0.1f, //высота квадрата
PacX=Start_X+dx/2,
PacY=Start_Y-dy/2;
//рисуем точку в середине квадрата
//задаем цвет белый
glColor3f (1, 1, 1);
//задаем размер точки в 8 пикселей в радиусе
glPointSize (8);
//Рисуем точку
glBegin(GL_POINTS);
glVertex2f(PacX , PacY); //Указываем точку
glEnd();
}
Можно вызвать данную функцию для проверки в DrawGLScene()
Запустим и увидим что точка рисуется в центре экрана
Как нарисовать маленькую точку на каждом щелчке мыши в WinForms PictureBox
У меня есть программа WinForms , где пользователь нажимает на PictureBox элемент управления.
Я хочу маленькую красную точку (несколько пикселей в поперечнике) каждый раз, когда пользователь нажимает.
Я также не хочу, чтобы ни одна из предыдущих точек исчезла.
Я знаю, что мне понадобится общий список эллипсов и прямоугольников, но я не уверен, как это выполнить. Как бы я поступил так?
В моей программе метод pictureBox1_Click обрабатывает события щелчка мыши и возвращает положение щелчков.
Метод pictureBox1_Paint обрабатывает графику, которая будет нарисована в этих точках.
3 ответа
Необходимо создать контейнер, который может ссылаться на коллекцию «Точки» и добавлять одну точку в коллекцию каждый раз, когда вы нажимаете на элемент управления с возможностью рисования.
Возможно, вы также хотите создать различные виды точек , основываясь на некоторых условиях или требованиях.
Таким образом, вам нужно хранить и эти дополнительные свойства, а не только координату точки.
Если это так, вам нужен специализированный объект, который может предоставлять эти свойства при необходимости.
Итак, вот пользовательский объект Class с некоторыми простыми свойствами, который позволяет вам определить цвет и размер точки. За каждую свою коллекцию очков.
Он также реализует интерфейс IDisposable , потому что нам нужно создать объект Pen для каждой нарисованной точки. И Pen объект должен быть удален (реализует IDisposable ).
Чтобы сделать рисунок, вам просто нужно вызвать Control.Invalidate() ( pictureBox1.Invalidate() в примере). Это вызывает перерисовку недействительных частей элемента управления, вызывая событие OnPaint() .
Каждая точка (которую нужно перекрасить) рисуется с помощью e.Graphics.DrawEllipse()
Вы можете проверить это следующим образом:
С предопределенными свойствами, используя только координату указателя мыши:
С определенными свойствами, когда требуется что-то другое:
С размером 8×8 пикселей
newPoint.Dot = new Rectangle(e.Location, new Size(8, 8)));
С оранжевой ручкой размером 2 пикселя
newPoint.DrawingPen = new Pen(Color.Orange, 2);
Добавьте этот новый пункт в коллекцию
myPoints.DrawingPoints.Add(newPoint);
EDIT :
Добавьте метод Clear() к основному объекту, который используется для Dispose() текущего списка точек, и создайте новый пустой список:
MyPoints.Clear();
Контейнер класса коллекции объектов Point:
Вот как он может работать, изменяя свои свойства при необходимости:
В основном вы должны использовать GDI +
Проверьте код ниже:
Список MyCircles доступен только в том случае, если вы хотите сохранить круги, чтобы позже отобразить изображение с кружками, а двойной щелчок — это пример его использования (я имею в виду постоянство, поскольку круги не покинут изображение, пока вы не закроете свое приложение). , Проверьте другие методы g для рисования линий, прямоугольников или чего-либо еще. (Использует пространство имен System.Drawing)
Я придумал простое решение для своей проблемы, я составил список прямоугольников:
Регистрация на форуме тут, о проблемах пишите сюда — alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите восстановить пароль
Поиск по форуму |
Расширенный поиск |
drunkentigerijk |
Посмотреть профиль |
Найти ещё сообщения от drunkentigerijk |
я загружаю картинку в picturebox, поверх нее нужно щелчком мыши нарисовать эллипс (один щелчок, один круг)
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
x = e.X; y = e.Y;
>
private void pictureBox1_Paint(object sender, PaintEventArgs e)
e.Graphics.DrawEllipse(Pens.Black, x, y, 15, 15);
pictureBox1.Invalidate();
>
проблема в том что предыдущие эллипсы стираются
drunkentigerijk |
Посмотреть профиль |
Найти ещё сообщения от drunkentigerijk |
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке — https://slurm.club/3MeqNEk
Осуществление ввода мышью в Windows Forms
Получение ввода с помощью мыши и его обработка является важной частью каждого приложения Windows. Вы можете управлять событиями мыши для выполнения действия в приложении или использовать сведения о расположении мыши для тестирования или выполнения других действий. Кроме того, можно изменить способ, который элементы управления в приложении применяют для обработки ввода с помощью мыши. В этом разделе подробно описываются события мыши, а также способы получения и изменения системных параметров мыши. Дополнительные сведения о данных, предоставляемых с помощью событий мыши, и порядке возникновения событий щелчка мыши см. в разделе События мыши в Windows Forms.
Расположение мыши и тестирование
Когда пользователь двигает мышь, операционная система перемещает указатель мыши. Указатель мыши содержит один пиксель, называемый активной точкой указателя мыши, которую операционная система отслеживает и распознает как расположение указателя. Когда пользователь перемещает мышь или нажимает кнопку мыши, Control, который содержит HotSpot, вызывает соответствующее событие мыши. Текущее расположение мыши можно получить с помощью свойства Location элемента MouseEventArgs при обработке события мыши или с помощью свойства Position класса Cursor. Затем можно использовать сведения о расположении мыши для тестирования, а затем выполнить действие в зависимости от расположения мыши. Функция тестирования встроена в несколько элементов управления в Windows Forms, таких как ListView, TreeView, MonthCalendar и элементы управления DataGridView. При использовании с соответствующим событием мыши, например MouseHover, тестирование очень полезно для определения того, когда приложение должно выполнить конкретное действие.
События мыши
Основной способ реагирования на ввод с помощью мыши заключается в обработке событий мыши. В следующей таблице показаны события мыши и описание их возникновения.
Событие мыши | Описание |
---|---|
Click | Это событие возникает при отпускании кнопки мыши, как правило, перед событием MouseUp. Обработчик этого события принимает аргумент типа EventArgs. Обрабатывать это событие следует в случае, если нужно только определить, когда происходит щелчок. |
MouseClick | Это событие возникает, когда пользователь щелкает элемент управления. Обработчик этого события принимает аргумент типа MouseEventArgs. Обрабатывать это событие следует в случае, когда необходимо получить сведения о мыши при щелчке. |
DoubleClick | Это событие происходит при двойном щелчке элемента управления. Обработчик этого события принимает аргумент типа EventArgs. Обрабатывать это событие следует в случае, если нужно только определить, когда происходит двойной щелчок. |
MouseDoubleClick | Это событие возникает, когда пользователь дважды щелкает мышью. Обработчик этого события принимает аргумент типа MouseEventArgs. Обрабатывать это событие следует в случае, когда необходимо получить сведения о мыши при двойном щелчке. |
MouseDown | Это событие происходит при нажатии пользователем кнопки мыши, когда указатель мыши находится на элементе управления. Обработчик этого события принимает аргумент типа MouseEventArgs. |
MouseEnter | Это событие возникает, когда указатель мыши перемещается на границу или клиентскую область элемента управления в зависимости от типа элемента управления. Обработчик этого события принимает аргумент типа EventArgs. |
MouseHover | Это событие возникает при остановке и помещении указателя мыши на элемент управления. Обработчик этого события принимает аргумент типа EventArgs. |
MouseLeave | Это событие возникает, когда указатель мыши покидает границу или клиентскую область элемента управления в зависимости от типа элемента управления. Обработчик этого события принимает аргумент типа EventArgs. |
MouseMove | Это событие возникает при перемещении указателя мыши на элемент управления. Обработчик этого события принимает аргумент типа MouseEventArgs. |
MouseUp | Это событие возникает, когда указатель мыши находится на элементе управления и пользователь отпускает кнопку мыши. Обработчик этого события принимает аргумент типа MouseEventArgs. |
MouseWheel | Это событие возникает, когда пользователь вращает колесико мыши, когда фокус находится на элементе управления. Обработчик этого события принимает аргумент типа MouseEventArgs. Для определения того, насколько прокручено колесико мыши, можно использовать свойство Delta элемента MouseEventArgs. |
Изменение параметров ввода и системы обнаружения с помощью мыши
Вы можете определить и изменить способ обработки элементами управления ввода с помощью мыши с помощью производного от элемента управления и использования методов GetStyle и SetStyle. Метод SetStyle принимает побитовое сочетание значений ControlStyles, чтобы определить, будет ли для элемента управления осуществлено стандартное нажатие, двойное нажатие кнопки мыши или элемент управления будет обрабатывать действие мыши самостоятельно. Кроме того, класс SystemInformation содержит свойства, описывающие возможности мыши и определяющие взаимодействие мыши с операционной системой. Эти свойства кратко представлены в следующей таблице.
У меня есть программа WinForms
, где пользователь нажимает на PictureBox
элемент управления.
Я хочу маленькую красную точку (несколько пикселей в поперечнике) каждый раз, когда пользователь нажимает.
Я также не хочу, чтобы ни одна из предыдущих точек исчезла.
Я знаю, что мне понадобится общий список эллипсов и прямоугольников, но я не уверен, как это выполнить. Как бы я поступил так?
В моей программе метод pictureBox1_Click
обрабатывает события щелчка мыши и возвращает положение щелчков.
Метод pictureBox1_Paint
обрабатывает графику, которая будет нарисована в этих точках.
3 ответа
Лучший ответ
Необходимо создать контейнер, который может ссылаться на коллекцию «Точки» и добавлять одну точку в коллекцию каждый раз, когда вы нажимаете на элемент управления с возможностью рисования.
Возможно, вы также хотите создать различные виды точек , основываясь на некоторых условиях или требованиях.
Таким образом, вам нужно хранить и эти дополнительные свойства, а не только координату точки.
Если это так, вам нужен специализированный объект, который может предоставлять эти свойства при необходимости.
Итак, вот пользовательский объект Class
с некоторыми простыми свойствами, который позволяет вам определить цвет и размер точки. За каждую свою коллекцию очков.
Он также реализует интерфейс IDisposable
, потому что нам нужно создать объект Pen
для каждой нарисованной точки. И Pen
объект должен быть удален (реализует IDisposable
).
Чтобы сделать рисунок, вам просто нужно вызвать Control.Invalidate()
(pictureBox1.Invalidate()
в примере). Это вызывает перерисовку недействительных частей элемента управления, вызывая событие OnPaint()
.
Каждая точка (которую нужно перекрасить) рисуется с помощью e.Graphics.DrawEllipse()
Вы можете проверить это следующим образом:
С предопределенными свойствами, используя только координату указателя мыши:
< Сильный > myPoints.Add(new MyPoints.DrawingPoint(e.Location));
С определенными свойствами, когда требуется что-то другое:
С размером 8×8 пикселей
< Сильный > newPoint.Dot = new Rectangle(e.Location, new Size(8, 8)));
С оранжевой ручкой размером 2 пикселя
< Сильный > newPoint.DrawingPen = new Pen(Color.Orange, 2);
Добавьте этот новый пункт в коллекцию
< Сильный > myPoints.DrawingPoints.Add(newPoint);
< Сильный > EDIT :
Добавьте метод Clear()
к основному объекту, который используется для Dispose()
текущего списка точек, и создайте новый пустой список:
< Сильный > MyPoints.Clear();
Пример реализации:
MyPoints myPoints = new MyPoints();
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//Use default property values
//myPoints.Add(new MyPoints.DrawingPoint(e.Location));
MyPoints.DrawingPoint newPoint = new MyPoints.DrawingPoint();
newPoint.Dot = new Rectangle(e.Location, new Size(4, 4));
newPoint.DrawingPen = new Pen(Color.Red, 2);
myPoints.DrawingPoints.Add(newPoint);
((Control)sender).Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
foreach (MyPoints.DrawingPoint mypoint in myPoints.DrawingPoints) {
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawEllipse(mypoint.DrawingPen, mypoint.Dot);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
myPoints.Dispose();
}
Контейнер класса коллекции объектов Point:
internal class MyPoints : IDisposable
{
bool IsDisposed = false;
public MyPoints() => DrawingPoints = new List<DrawingPoint>();
public List<DrawingPoint> DrawingPoints { get; set; }
public void Add(DrawingPoint NewPoint)
{
if (NewPoint.Dot.Size.Width > 1 && NewPoint.Dot.Size.Height > 1)
DrawingPoints.Add(NewPoint);
}
public void Clear()
{
this.Dispose();
this.DrawingPoints.Clear();
this.DrawingPoints = new List<DrawingPoint>();
}
public void Remove(Point point)
{
Remove(this.DrawingPoints.Select((p, i) => { if (p.Dot.Contains(point)) return i; return -1; }).First());
}
public void Remove(int Index)
{
if (Index > -1)
{
this.DrawingPoints[Index].Delete();
this.DrawingPoints.RemoveAt(Index);
}
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(bool IsSafeDisposing)
{
if (IsSafeDisposing && (!this.IsDisposed) && (this.DrawingPoints.Count > 0))
{
foreach (DrawingPoint dp in this.DrawingPoints)
if (dp != null) dp.Delete();
}
}
public class DrawingPoint
{
Pen m_Pen = null;
Rectangle m_Dot = Rectangle.Empty;
public DrawingPoint() : this(Point.Empty) { }
public DrawingPoint(Point newPoint)
{
this.m_Pen = new Pen(Color.Red, 1);
this.m_Dot = new Rectangle(newPoint, new Size(2, 2));
}
public Pen DrawingPen { get => this.m_Pen; set => this.m_Pen = value; }
public Rectangle Dot { get => this.m_Dot; set => this.m_Dot = value; }
public void Delete()
{
if (this.m_Pen != null) this.m_Pen.Dispose();
}
}
}
Вот как он может работать, изменяя свои свойства при необходимости:
1
Jimi
9 Окт 2018 в 03:52
В основном вы должны использовать GDI +
Проверьте код ниже:
private void pictureBox1_Click(object sender, EventArgs e)
{
Graphics g = Graphics.FromImage(pictureBox1.Image);
Pen p = new Pen(Color.Red, 3);
var cursorPosition = pictureBox1.PointToClient(Cursor.Position);
g.DrawEllipse(p, cursorPosition.X, cursorPosition.Y, 15, 15);
MyCircles.Add(cursorPosition);
pictureBox1.Refresh();
}
List<Point> MyCircles = new List<Point>();
private void pictureBox1_DoubleClick(object sender, EventArgs e)
{
foreach (var item in MyCircles)
{
MessageBox.Show($"One circle was created: X:{item.X}, Y:{item.Y}");
}
}
Список MyCircles доступен только в том случае, если вы хотите сохранить круги, чтобы позже отобразить изображение с кружками, а двойной щелчок — это пример его использования (я имею в виду постоянство, поскольку круги не покинут изображение, пока вы не закроете свое приложение). , Проверьте другие методы g для рисования линий, прямоугольников или чего-либо еще. (Использует пространство имен System.Drawing)
1
Felipe Torres
1 Окт 2018 в 22:58
Я придумал простое решение для своей проблемы, я составил список прямоугольников:
List<Rectangle> rects = new List<Rectangle>();
И добавил прямоугольники с каждым кликом:
private void pictureBox1_Click(object sender, MouseEventArgs e)
{
rects.Add(new Rectangle(e.Location, new Size(4,4)));
}
И нарисовал точки:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
foreach (var rect in rects)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.DrawEllipse(magenta,rect);
}
}
И добавил метод очистки рисунков с помощью rects.Clear ()
0
Eric Lopez-Reyes
2 Окт 2018 в 19:38
У меня есть изображение размером 100х50 и я хочу нарисовать точку в центре — т.е. 50х25. Как бы я это сделал?
4 ответы
ответ дан 14 авг.
Graphics g = pictureBox1.CreateGraphics();
g.DrawEllipse(Pens.Black, new Rectangle(50, 25, 1, 1));
смотреть здесь для сохранения картинки
он не рисует при загрузке формы, поэтому вы должны добавить свой код в форму paint
мероприятие :
private void Form1_Paint(object sender, PaintEventArgs e)
{
Application.DoEvents();
Graphics g = pictureBox1.CreateGraphics();
g.DrawEllipse(Pens.DarkBlue, new Rectangle(120, 90, 1, 1));
}
ответ дан 23 мая ’17, 12:05
Image img = pictureBox1.Image;
Graphics g = Graphics.FromImage(img);
g.DrawEllipse(Pens.DarkBlue, new Rectangle(50, 25, 1, 1));
g.DrawImage(img, new Point(0, 0));
img.Save("d:\img.Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
ответ дан 14 авг.
попробуйте это для другого вопроса:
Rectangle bounds = new Rectangle(10, 20, 50, 60);
Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height);
Graphics g = Graphics.FromImage(bitmap);
g.CopyFromScreen(Point.Empty,Point.Empty, bounds.Size);
bitmap.Save("d:\img.Jpeg", System.Drawing.Imaging.ImageFormat.Jpeg);
этот код захватит экран с прямоугольником границ.
ответ дан 14 авг.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками
c#
or задайте свой вопрос.