Как нарисовать точку в c windows forms

Рисование точки на панели, форме или picturebox C# Решение и ответ на вопрос 2409247

belalugoci

3 / 199 / 22

Регистрация: 01.06.2018

Сообщений: 2,482

1

25.02.2019, 11:32. Показов 12333. Ответов 17

Метки нет (Все метки)


Находил темы и на этом форуме и многие другие, но так и не получилось ничего запустить чтобы работало, то ругается на

C#
1
Bitmap bmp = new Bitmap();

то еще что-то. Поэтому спрашиваю рабочие варианты на 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

Цитата
Сообщение от csharp08
Посмотреть сообщение

Graphics

C#
1
2
3
            Image newImage = new Image();
            PointF ulCorner = new PointF(100.0F, 100.0F);
            e.Graphics.DrawImage(newImage, ulCorner);

Ошибка CS0144 Не удается создать экземпляр абстрактного класса или интерфейса «Image»

и открыт вопрос — куда он нарисует? подозреваю не на панель.
PS: если бы я не умел гуглить, то я создал бы тему в разделе «Гугл для начинающих» и задал бы вопрос там.



0



Даценд

Эксперт .NET

5858 / 4735 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

25.02.2019, 11:57

4

Рисование на форме:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public Form1()
{
    InitializeComponent();
    this.Paint += Form1_Paint; //подписываемся на событие Paint формы
}
 
private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics gr = e.Graphics; //будем рисовать на канвасе формы
    gr.DrawRectangle(Pens.Red, 20, 20, 1, 1); //красная точка
    gr.DrawRectangle(Pens.Purple, 30, 20, 60, 60);//незакрашенный фиолетовый прамоугольник
    gr.FillRectangle(Brushes.Red, 100, 20, 60, 60); //закрашенный красный прямоугольник
}

Для рисования на панели или любом другом элементе нужно подписаться на 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» не существует в текущем контексте.
Ошибка CS1061 «EventArgs» не содержит определения для «Graphics», и не удалось найти доступный метод расширения «Graphics», принимающий тип «EventArgs» в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).



0



Эксперт .NET

5858 / 4735 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

25.02.2019, 12:07

6

Цитата
Сообщение от belalugoci
Посмотреть сообщение

Откуда получена информация что именно так оно называется?

Произвольное название. Главное чтобы названия в 4-й и 7-й строках совпадали.
Если планируете программировать под WinForms, то советую разобраться с подпиской на события.

Цитата
Сообщение от belalugoci
Посмотреть сообщение

как узнаёт что речь про рисование на форме?

Вторым параметром метода Form1_Paint является объект PaintEventArgs e, в который передается дополнительная информация о объекте, на событие которого метод подписан.

Цитата
Сообщение от belalugoci
Посмотреть сообщение

и как указать чтобы рисовал на панели?

Не дочитали?

Цитата
Сообщение от Даценд
Посмотреть сообщение

Для рисования на панели или любом другом элементе нужно подписаться на 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 это форма
используем panel1 и подписываемся на Paint панели. Имя можно любое, главное чтобы в panel1.Paint записывалось то что нужно.

теперь разобрался.

Добавлено через 5 минут

Цитата
Сообщение от Даценд
Посмотреть сообщение

Для рисования на панели

я правильно понимаю что в Paint нужно написать универсальный код отрисовки, а через параментры передавать информацию — что именно рисовать. То есть список объектов для отрисовки, так?
а после изменения списка объектов вручную вызывать перерисовку?



0



Даценд

Эксперт .NET

5858 / 4735 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

25.02.2019, 12:34

8

belalugoci,
У меня нет времени развернуто отвечать на вопросы, разжевывая азы программирования в среде Windows Forms.
Я выше посоветовал:

Цитата
Сообщение от Даценд
Посмотреть сообщение

Если планируете программировать под WinForms, то советую разобраться с подпиской на события.

Последний раз пробую:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public Form1() //в конструкторе формы
{
    InitializeComponent();
    this.Paint += Vasya_Paint; //подписываем метод Vasya_Paint на событие Paint формы (this в данном случае - форма).
    panel1.Paint += Dusja_Paint; //к примеру это подписка метода Dusja_Paint на событие Paint панели panel1
}
 
private void Vasya_Paint(object sender, PaintEventArgs e) //Вот метод Vasya_Paint, который мы подписали
{
   //при наступлении события в метод передается ссылка на форму (object sender) и дополнительные параметры для рисования (PaintEventArgs e) на элементе (в данном случае - форме), переданном как sender
   Graphics gr = e.Graphics; //получаем канвас формы
   //...
}
 
private void Dusja_Paint(object sender, PaintEventArgs e) //метод - обработчик Paint панели
{
   Graphics gr = e.Graphics; //получаем канвас панели
   //...
}



0



3 / 199 / 22

Регистрация: 01.06.2018

Сообщений: 2,482

25.02.2019, 12:36

 [ТС]

9

Цитата
Сообщение от Даценд
Посмотреть сообщение

Для рисования

а не будет ли производительнее рисовать только то что изменилось без перерисовки всего остального? или Paint так и работает?
я о том, что у меня например есть 4069 точек, я их нарисовал, но потом я меняю значения некоторых, допустим 5 штук. Проще наверное было бы нарисовать 5 точек другим цветом чем опять перерисовывать 4096 точек.



0



Эксперт .NET

5858 / 4735 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

25.02.2019, 12:39

10

Цитата
Сообщение от belalugoci
Посмотреть сообщение

без перерисовки всего остального?

не обойтись



0



3 / 199 / 22

Регистрация: 01.06.2018

Сообщений: 2,482

25.02.2019, 12:52

 [ТС]

11

Цитата
Сообщение от Даценд
Посмотреть сообщение

У меня нет времени развернуто отвечать на вопросы, разжевывая азы программирования в среде Windows Forms.

как вариант — не сидеть на форуме и не отвечать на вопросы совсем — времени будет много.

Цитата
Сообщение от Даценд
Посмотреть сообщение

Я выше посоветовал:

зашел по такой ссылке
https://docs.microsoft.com/ru-… rom-events
прочитал, без вашего объяснения в этой теме всё равно бы не понял что там делают и зачем. имхо но там написано не так как стоило бы написать.

Цитата
Сообщение от Даценд
Посмотреть сообщение

Последний раз пробую:

я уже написал что я разобрался.

Добавлено через 8 минут

Цитата
Сообщение от Даценд
Посмотреть сообщение

не обойтись

скорость ад, примерно 0,3 fps.



0



Фрилансер

803 / 310 / 148

Регистрация: 13.02.2019

Сообщений: 1,071

26.02.2019, 13:47

12

Цитата
Сообщение от belalugoci
Посмотреть сообщение

скорость ад, примерно 0,3 fps.

Так GDI не про высокий fps. Нужен высокий fps, используйте OpenGL или DirectX

Добавлено через 3 минуты

Цитата
Сообщение от belalugoci
Посмотреть сообщение

0,3 fps

Если не секрет, что Вы там такое ужасное рисуете, что отрисовка больше 3-х секунд занимает? Или Вы на калькуляторе рисуете? )))



0



3 / 199 / 22

Регистрация: 01.06.2018

Сообщений: 2,482

26.02.2019, 13:58

 [ТС]

13

Цитата
Сообщение от asn31337
Посмотреть сообщение

Если не секрет, что Вы там такое ужасное рисуете, что отрисовка больше 3-х секунд занимает? Или Вы на калькуляторе рисуете? )))

время утрирую, считать всё равно нечем, так что на глаз. рисуется матрица из 4096 квадратиков 8х8 разными цветами.



0



Фрилансер

803 / 310 / 148

Регистрация: 13.02.2019

Сообщений: 1,071

26.02.2019, 14:16

14

Цитата
Сообщение от belalugoci
Посмотреть сообщение

считать всё равно нечем

Stopwatch?

Цитата
Сообщение от belalugoci
Посмотреть сообщение

рисуется матрица из 4096 квадратиков 8х8 разными цветами.

Цитата
Сообщение от asn31337
Посмотреть сообщение

примерно 0,3 fps

У меня весь процесс занял 10 мс… Так что насчет 0,3 фпс как то сомнительно)))



0



3 / 199 / 22

Регистрация: 01.06.2018

Сообщений: 2,482

26.02.2019, 15:53

 [ТС]

15

Цитата
Сообщение от asn31337
Посмотреть сообщение

У меня весь процесс занял 10 мс… Так что насчет 0,3 фпс как то сомнительно)))

цель этого разговора? я вижу как рисуется матрица, мне этого достаточно чтобы сказать что это медленно.

Цитата
Сообщение от asn31337
Посмотреть сообщение

Stopwatch?

ей богу не понимаю я людей, у одного времени мало, другому заняться нечем. Главное остается неизменным — я в любом случае что-то для кого-то делаю не так.



0



Фрилансер

803 / 310 / 148

Регистрация: 13.02.2019

Сообщений: 1,071

26.02.2019, 16:17

16

Цитата
Сообщение от belalugoci
Посмотреть сообщение

цель этого разговора?

Цитата
Сообщение от belalugoci
Посмотреть сообщение

ей богу не понимаю я людей

Мда… Комментарии тут излишни… Извините, что посмели высказать свое мнение, которое не совпадает с мнением Вашего Величества! ))) Более не повторится)))

Цитата
Сообщение от belalugoci
Посмотреть сообщение

я вижу как рисуется матрица

Ну тут всего 2 варианта:
1. у Вас чертовски быстрое зрение
2.

Цитата
Сообщение от belalugoci
Посмотреть сообщение

я в любом случае что-то для кого-то делаю не так



2



3 / 199 / 22

Регистрация: 01.06.2018

Сообщений: 2,482

26.02.2019, 16:43

 [ТС]

17

Цитата
Сообщение от asn31337
Посмотреть сообщение

Извините, что посмели высказать свое мнение

Это должно ведь работать в обе стороны? Должно быть ваше мнение и моё мнение, но почему-то вы совсем игнорируете моё мнение и навязываете ваше.

Цитата
Сообщение от asn31337
Посмотреть сообщение

Ну тут всего 2 варианта

Есть еще несколько, но вам они ведь не интересны.



0



belalugoci

3 / 199 / 22

Регистрация: 01.06.2018

Сообщений: 2,482

27.02.2019, 11:21

 [ТС]

18

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gr = e.Graphics;
            for (int x1 = 0; x1 < 64; x1++)
                for (int y1 = 0; y1 < 64; y1++)
                {
                    switch (bufRed[x1, y1])
                    {
                        case 1:
                            gr.FillRectangle(Brushes.Red, x1 * 8, y1 * 8, 8, 8);
                            break;
                        case 2:
                            gr.FillRectangle(Brushes.Yellow, x1 * 8, y1 * 8, 8, 8);
                            break;
                        default:
                            gr.FillRectangle(Brushes.Black, x1 * 8, y1 * 8, 8, 8);
                            break;
                    }
                }
        }

получилось так. Время прорисовки удалось сократить убрав код который считает буфер точек в другую область программы. Сейчас 3 мс на прорисовку, хоть моргание при первом заполнении и видно, но это уже не критично.
на картинке то, как оно выглядит.

Миниатюры

Рисование точки на панели, форме или picturebox
 



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's user avatar

Mark Hildreth

41.3k11 gold badges119 silver badges108 bronze badges

asked Aug 14, 2012 at 6:10

user1578358's user avatar

1

you could use the setPixle() function.

answered Aug 14, 2012 at 6:27

elyashiv's user avatar

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 paintevent :

private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Application.DoEvents();
        Graphics g = pictureBox1.CreateGraphics();
        g.DrawEllipse(Pens.DarkBlue, new Rectangle(120, 90, 1, 1));
    }

Community's user avatar

answered Aug 14, 2012 at 6:16

Mahdi Tahsildari's user avatar

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 Zare's user avatar

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 Zare's user avatar

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's user avatar

Mark Hildreth

41.3k11 gold badges119 silver badges108 bronze badges

asked Aug 14, 2012 at 6:10

user1578358's user avatar

1

you could use the setPixle() function.

answered Aug 14, 2012 at 6:27

elyashiv's user avatar

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 paintevent :

private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Application.DoEvents();
        Graphics g = pictureBox1.CreateGraphics();
        g.DrawEllipse(Pens.DarkBlue, new Rectangle(120, 90, 1, 1));
    }

Community's user avatar

answered Aug 14, 2012 at 6:16

Mahdi Tahsildari's user avatar

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 Zare's user avatar

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 Zare's user avatar

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();
        }
    }
}

Вот как он может работать, изменяя свои свойства при необходимости:

DottedColors1


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 задайте свой вопрос.

Понравилась статья? Поделить с друзьями:

Вот еще несколько интересных статей:

  • Как нарисовать свой курсор мыши на windows 10
  • Как написать маршрут в windows 10
  • Как нарисовать свой курсор для windows 10
  • Как написать калькулятор на c windows forms
  • Как нарисовать линию в windows form

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии