Как рисовать круг и строку в окне изображения?
Как рисовать круг и строку в окне изображения?
Ответы
Ответ 1
picturebox - это элемент управления и имеет изображение как источник - поэтому вам нужно нарисовать изображение и передать изображение в элемент управления, чтобы показать его
MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
Ответ 2
или
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLine(
new Pen(Color.Red,2f),
new Point(0,0),
new Point(pictureBox1.Size.Width, pictureBox1.Size.Height ));
e.Graphics.DrawEllipse(
new Pen(Color.Red, 2f),
0,0, pictureBox1.Size.Width, pictureBox1.Size.Height );
}
Обработайте событие рисования в окне изображения и сделайте свой собственный рисунок там.
Ответ 3
Лучший способ - НЕ рисовать круг и линию в картинке! Он не предназначен для этой цели.
Из блога Боба Пауэлла GDI+:
Корень этой проблемы в том, что основные правила программирования Windows были нарушены. И как следствие, картина коробки обвиняют в чем-то, что на самом деле не его вина. Чтобы помочь объяснить, почему, четыре пункта ниже показывают, что пошло не так в этом случае.
-
Элемент управления PictureBox предназначен для отображения изображений. Это не удобный заполнитель для графической поверхности.
-
Windows - это система, управляемая событиями, в которой каждое событие должно обслуживаться в правильном контексте, а события, предназначенные для обработки событий нажатия кнопки или перемещения мыши, не должны использоваться для рисования на экране или других странных вещей.
-
PictureBox обновляется, рисуя объект на основе System.Drawing.Image, хранящийся в его свойстве Image. Если изображения нет, будет показан цвет фона.
-
Кража и рисование на объекте Graphics любого элемента управления не является хорошей практикой, следует настоятельно не поощрять и нарушать правила обработки событий в нужном месте в нужное время. В основном, если вы сделаете это, это причинит вам боль. Когда вы бьетесь головой о стену, это причиняет вам боль. это признак того, что вы должны прекратить это делать. То же самое для вызова PictureBox.CreateGraphics.
Правильный способ сделать это.
Следовать правилам управляемой событиями системы легко, но нужно немного подумать. Итак, если вы хотите нарисовать немного графики и оставить ее там, когда окно перемещается перед ним и снова исчезает, или когда вы минимизируете и восстанавливаете, вы должны обслуживать событие Paint любого объекта, который вы хотите рисовать на. PictureBox несет с собой багаж, который не нужен для такого рода приложений. Если вы просто хотите нарисовать что-то в одном месте, нарисуйте это в форме, отвечая на событие Form.Paint. Если вам нужен удобный заполнитель для графики, работающей в заданных пределах, используйте элемент управления Panel и обслуживайте его событие Paint. Если вы хотите дублировать изображение снова и снова для корпоративного имиджа, создайте элемент управления и выполните рисование в переопределении OnPaint.
Исходная ссылка (больше не действительна): http://bobpowell.net/picturebox.htm
ПРИМЕЧАНИЕ. Исходная ссылка на блог Боба Пауэлла больше не работает. Я оставил это здесь для исторических целей. Содержание страницы все еще можно просмотреть в интернет-архиве (https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm) на дату, когда этот пост был отредактирован.
Ответ 4
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Asssignment
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Blue);
int radius = 200;
int x =Width/2;
int y =Height/2;
int first_point1 = (int)(Math.Cos(0) * radius + x);
int first_point2 = (int)(Math.Sin(0) * radius + y);
Point p1= new Point(first_point1,first_point2);
for(int i=1;i<500; i++)
{
int dx = (int)(Math.Cos(i)*radius+x );
int dy = (int)(Math.Sin(i)*radius+y );
Point p2 = new Point(dx, dy);
g.DrawLine(p, p1, p2);
p1 = p2;
}
}
}
}