Как сделать так, чтобы после нажатия кнопки можно было щелкнуть мышкой в PictureBox и там бы нарисовался круг?
Windows Forms. В общем, допустим, что есть Button1 — добавить круг, PictureBoх, в котором этот круг рисуется и событие MouseClick, по которому должен нарисоваться круг в PictureBox’e.
Как сделать так, чтобы после нажатия кнопки (Добавить круг) можно было щелкнуть мышкой в поле PictureBox’a и там бы нарисовался круг?
- Вопрос задан более трёх лет назад
- 9589 просмотров
- Вконтакте
Фигуры фиксированного размера можно нарисовать так:
В качестве кнопок используются RadioButton, т.к. это удобней.
Чтобы не стиралось, можно сделать Bitmap:
И после завершения рисования, передать картинку в PictureBox:
pic.Image = bmp;
Результат:

- Вконтакте
Самое тупое что могу предложить.
По клику на кнопку делать какую-то переменную = true.
в Onclick PicrureBox-а проверять если переменная = true то делать то-то.
Но это так, глупости, я уверен можно сделать лучше.
- Вконтакте
Ну вот примерно так:
private void button_add_crc_Click(object sender, EventArgs e)
<
// выставим флаг кнопки
crc_OK = true;
>
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
<
// проверка флага нажатия
if (!crc_OK)
return;
//
Bitmap tmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(tmp);
g.DrawEllipse(new Pen(Color.Black, 3), e.X, e.Y, 50, 50);
pictureBox1.Image = tmp;
g.Dispose();
>
Но тогда если еще раз щелкнуть мышкой, то нарисованный круг не сохраняется, а просто рисуется новый. А нужно, чтобы все оставались.
Nem0_o: Вам просто нужно запилить проверку на существование переменной tmp (в вашем случае).
Если она есть, значит не делать new Bitmap и т д.
Если нету то делать new Bitmap
нарисовать круг вокруг курсора мыши на рабочем столе Windows
Например, как круг CamStudio, который появляется в событии onMouseClick. Или как круг, который появляется вокруг курсора мыши при событии щелчка, когда работает Windows PSR.exe.
некоторые пользователи рекомендовали прозрачную форму, чтобы легко управлять Событие onMouseClick.
на мой взгляд, это неправильное решение по ряду причин.
Главное, что если вы создаете прозрачную форму, появляются очень трудно управлять событием клика, например, на панели задач (как указано в этих других дискуссиях)
с моей точки зрения, интуитивно, решение «крючков» с неуправляемый код, как предложено здесь от Microsoft https://support.microsoft.com/en-us/help/318804/how-to-set-a-windows-hook-in-visual-c-net, это лучшее решение.
Должно быть достаточно управлять двумя событиями: щелчком мыши и событием что включает / отключает mouseSonar.
Никакие прозрачные формы не заблокированы как активные окна, и нажмите на Панель задач, дать правильный результат.
Но, честно говоря, я новичок в .net, и я не знаю, насколько важен неуправляемый код в продвинутом программировании.
На мой взгляд, было бы третье решение (я думаю, что должен быть лучшим)
Если бы был класс, который сделал бы управление Событие onMouseClick также выходит за границы формы пользовательского интерфейса, щелкнув мышью это может быть управляется с помощью «безопасного» кода.
Например, класс System.Windows.Input.MouseDevice, а также есть свойство OverrideCursor, позволяющее установить курсор для всего приложения.
Но Microsoft отмечает: «MouseDevice поддерживает Windows Presentation Foundation (WPF) и не предназначен для использования прямо из вашего кода.
Мы нашли способ установить «Показывать местоположение указателя при нажатии клавиши Ctrl» (MOUSESONAR) по коду.
3 ответа
Когда я начинал этот вопрос, большинство советов, которые я собрал, это «перейти на WPF».
Кажется, что управлять событием mouseClick всего рабочего стола (а также панели задач) не так просто в приложении WinForm.
В этом направлении я нашел помощь здесь
Мне кажется, что обрабатывать «щелчок мышью на рабочем столе», это не так просто сделать в приложении WinForm, и что лучший способ должен быть перейти с WinForm на WPF .
Но это не в моем плане изменить.
С другой стороны, мне кажется, что некоторые другие разработчики (возможно, опытные) подходят к этому вопросу с другой точки зрения: взаимодействие между WinForm и Windows API (неуправляемый код) «ловушкой».
Я нашел стартовую страницу здесь:
Нашел хорошую ссылку здесь
И очень хорошее и глубокое объяснение здесь:
В частности, читая эту последнюю страницу, позвольте мне понять, что способ глубокого изучения того, как создать «хорошо управляемый хук-код», крайне сложен для человека с моим уровнем программирования.
Итак, на данный момент, я столкнулся с двумя способами:
Первым было перейти с WinForm на WPF .
Вторым было глубокое изучение взаимодействия WinForm и Windows API (слишком много для меня).
Но я думаю, что есть другой способ, где я могу продолжать разработку в vb.net/c#, и я могу собрать свое приложение в очень короткое время.
Использование уже созданных библиотек: поиск в Google .
Я проверил некоторые, а затем я выбрал MouseKeyHook (бесплатно)
И в нескольких строках кода у меня есть решение.
Я хочу отметить, что в этом режиме я не изучаю способ взаимодействия между WinForm и Windows Api.
Я изучаю только те несколько команд, которые позволяют мне использовать эту библиотеку.
Я думаю, что этот ответ мог бы помочь многим различным пользователям, с различными потребностями: тем, кому нужно переключиться на WPF, кому нужно глубоко изучить, кому нужен быстрый способ.
Вы можете найти документацию здесь:
Лицензия является полностью бесплатной (лицензия MIT), только с примечанием автора «Вышеуказанное уведомление об авторских правах и это уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения».
Единственная плохая вещь, которую я обнаружил, это то, что в реальном времени защита от вирусов Avira, Alert ложная уверенность. Я полагаю, это подпрограмма «ловушки», потому что я попытался просто скомпилировать и выполнить свою собственную закодированную подпрограмму «WindowsHookEx», и Avira перехватила .exe как ложное срабатывание.
Также проверено на VirusTotal и дает 100% чистоту (0/67) также с помощью сканирования Avira.
Нотабене Я забыл сообщить о помощи, которую NineBerry дал мне со своим MouseSonar в другом сообщении
Так что, мне кажется, это просто вызов этих трех процедур в MouseClick Event, чтобы получить круг на mouseClick вне WinForm, без проблем управлять прозрачностью, формами, взаимодействием с панелью задач и кодированием.
Перейдите в свойства мыши и включите «Показывать местоположение указателя при нажатии клавиши CTRL».
Если вы нажмете CTRL, на короткое время вокруг указателя мыши появится круг.
Как создать круг щелчком мыши winforms
Комментарий: с помощью мыши пользователь может рисовать любую геометрическую фигуру на форме. Рассматривая события для формы, можно найти такие события, относящиеся к мыши, как MouseDown (нажали клавишу мыши), MouseUp (отпустили клавишу мыши), MouseMove (сдвинули мышь) и т.д.
Если рассмотреть заголовок процедуры private void Forml_MouseMove (object sender, MouseEventArgs e), то мы видим два параметра, один с именем sender, имеющий тип Object. Он обозначает объект, с которым случилось событие, в нашем случае — форма. Другой параметр имеет имя е и относится к классу MouseEventArgs. Данный параметр содержит информацию о событии, например, какая кнопка мыши была нажата и какие координаты в данный момент у мыши.
Добавим в проект еще одну форму (Form2) и выставим свойство Startposition = CenterScreen. На вторую форму добавим кнопку buttonl (выход из программы) и напишем ее код:
Реализация листинга 231 позволит пользователю рисовать на форме с помощью мыши.
Как нарисовать маленькую точку на каждом щелчке мыши в 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)
Я придумал простое решение для своей проблемы, я составил список прямоугольников:
Как проще всего добавить на форму WindowsForms круг, цвет которого можно программно менять?
Нужно добавить на форму круг, цвет которого можно переключать программно (зелёный, желтый, красный).
Можно сделать три pictureBox’а и из них каждый раз оставлять один видимый, но таких кружков требуется три штуки. Такое решение звучит как-то угловато. Может есть более элегантное?
![]()
Удобнее всего сделать повторно используемый пользовательский контрол:
Через свойство Color можно задавать цвет окружности. При смене цвета окружность будет перерисована.
Вы можете рисовать в методе OnPaint разными способами: DrawEllipse — окружность. FillEllipse — закрашенный круг.
Добавить контрол на форму можно через дизайнер или в конструкторе:
Обновление
По умолчанию форма контрола будет прямоугольная и при размещении над другими контролами будут видны края. Чтобы избежать этого эффекта нужно добавить следующий код:
Как сделать так, чтобы после нажатия кнопки можно было щелкнуть мышкой в PictureBox и там бы нарисовался круг?
Windows Forms. В общем, допустим, что есть Button1 — добавить круг, PictureBoх, в котором этот круг рисуется и событие MouseClick, по которому должен нарисоваться круг в PictureBox’e.
Как сделать так, чтобы после нажатия кнопки (Добавить круг) можно было щелкнуть мышкой в поле PictureBox’a и там бы нарисовался круг?
- Вопрос задан более трёх лет назад
- 9358 просмотров
- Вконтакте

Фигуры фиксированного размера можно нарисовать так:
В качестве кнопок используются RadioButton, т.к. это удобней.
Чтобы не стиралось, можно сделать Bitmap:
И после завершения рисования, передать картинку в PictureBox:
pic.Image = bmp;
Результат: 
- Вконтакте
Самое тупое что могу предложить.
По клику на кнопку делать какую-то переменную = true.
в Onclick PicrureBox-а проверять если переменная = true то делать то-то.
Но это так, глупости, я уверен можно сделать лучше.
- Вконтакте
Ну вот примерно так:
private void button_add_crc_Click(object sender, EventArgs e)
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
Но тогда если еще раз щелкнуть мышкой, то нарисованный круг не сохраняется, а просто рисуется новый. А нужно, чтобы все оставались.
Nem0_o: Вам просто нужно запилить проверку на существование переменной tmp (в вашем случае).
Если она есть, значит не делать new Bitmap и т д.
Если нету то делать new Bitmap
Заставка 13. Рисование с помощью мыши.
Комментарий: с помощью мыши пользователь может рисовать любую геометрическую фигуру на форме. Рассматривая события для формы, можно найти такие события, относящиеся к мыши, как MouseDown (нажали клавишу мыши), MouseUp (отпустили клавишу мыши), MouseMove (сдвинули мышь) и т.д.
Если рассмотреть заголовок процедуры private void Forml_MouseMove (object sender, MouseEventArgs e), то мы видим два параметра, один с именем sender, имеющий тип Object. Он обозначает объект, с которым случилось событие, в нашем случае — форма. Другой параметр имеет имя е и относится к классу MouseEventArgs. Данный параметр содержит информацию о событии, например, какая кнопка мыши была нажата и какие координаты в данный момент у мыши.
Добавим в проект еще одну форму (Form2) и выставим свойство Startposition = CenterScreen. На вторую форму добавим кнопку buttonl (выход из программы) и напишем ее код:
Реализация листинга 231 позволит пользователю рисовать на форме с помощью мыши.