Как нарисовать круг и линию в картинке? - PullRequest
14 голосов
/ 28 апреля 2010

Как нарисовать круг и линию в картинке?

Ответы [ 4 ]

29 голосов
/ 28 апреля 2010

или

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

Обработайте событие рисования графического блока и сделайте там свой собственный рисунок.

5 голосов
/ 28 апреля 2010

Лучший способ - НЕ рисовать круг и линию в картинке! Он не предназначен для этой цели.

Из блога Боба Пауэлла 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) на дату редактирования этого сообщения.

0 голосов
/ 19 мая 2019
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;
            }
        }
    }
}
0 голосов
/ 28 апреля 2010

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

MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
...