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

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


person Alexry    schedule 28.04.2010    source источник


Ответы (3)


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

MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
person Gambrinus    schedule 28.04.2010
comment
Это рисует в растровое изображение, а не на изображение. Это работает, но это нечто совершенно другое! - person TaW; 21.02.2017
comment
Это не отвечает на вопрос плаката. - person Mark Roworth; 28.01.2021

or:

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

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

person Paul Sasik    schedule 28.04.2010
comment
Это правильный ответ на вопрос. - person Mark Roworth; 28.01.2021

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

Из блога Боба Пауэлла GDI+:

Корень этой проблемы в том, что фундаментальные правила программирования Windows были нарушены. И как следствие фото бокс обвиняют в том, что на самом деле не его вина. Чтобы объяснить, почему, в четырех приведенных ниже пунктах показано, что пошло не так в этом случае.

  • Элемент управления PictureBox предназначен для отображения изображений. Это не удобный заполнитель для графической поверхности.

  • Windows — это система, управляемая событиями, в которой каждое событие должно обслуживаться в правильном контексте, а события, предназначенные для обработки событий нажатия кнопки или перемещения мыши, не должны использоваться для рисования на экране или других странных вещей.

  • PictureBox обновляется, рисуя объект на основе System.Drawing.Image, хранящийся в его свойстве Image. Если изображения нет, оно будет показывать цвет фона.

  • Кража и использование объекта Graphics любого элемента управления не является хорошей практикой, категорически не рекомендуется и нарушает правила обработки событий в нужном месте в нужное время. В основном, если вы это сделаете, это причинит вам боль. Когда ты бьешься головой о стену, это причиняет тебе боль. это знак того, что вы должны прекратить это делать. То же самое и с вызовом PictureBox.CreateGraphics.

Правильный способ сделать это.

Следовать правилам системы, управляемой событиями, легко, но это требует некоторой предусмотрительности. Итак, если вы хотите нарисовать немного графики и оставить ее там, когда окно перемещается перед ним и снова удаляется, или когда вы сворачиваете и восстанавливаете, вы должны обслуживать событие Paint любого объекта, который вы хотите. рисовать. PictureBox несет с собой багаж, который не нужен для такого рода приложений. Если вы просто хотите что-то нарисовать в одном месте, нарисуйте это на форме, отреагировав на событие Form.Paint. Если вам нужен удобный заполнитель для графики, которая работает в заданных границах, используйте элемент управления Panel и обслуживайте его событие Paint. Если вы хотите снова и снова дублировать графику для своего корпоративного изображения, создайте элемент управления и выполните рисование в переопределении OnPaint.

Источник: https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm (исходный сайт больше не существует).

person Chris Dunaway    schedule 28.04.2010
comment
+1 Это действительно правильный ответ. Спасибо за ссылку, в которой описана корневая проблема. - person Sabuncu; 05.04.2014
comment
-1 Linkrot ... и этот ответ дает несколько подсказок относительно того, в чем проблема или что делать вместо этого. Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели некоторое представление о том, что это такое и почему оно там. Всегда цитируйте наиболее релевантную часть важной ссылки на случай, если целевой сайт недоступен или навсегда отключится. Источник: stackoverflow.com/help/how-to-answer Однако я нашел страницы bobpowell, сохраненные в Wayback. Компьютер: https://web.archive.org/web/20120216111903/http://bobpowell.net/picturebox.htm - person Andreas Jansson; 01.05.2015
comment
Это ужасный ответ. (В противном случае отличные) страницы bobpowell не только исчезли, но и никоим образом не предполагают, что вам не следует рисовать на PictureBox. На самом деле их двойная буферизация по умолчанию делает их единственными элементами управления, которые подходят для рисования из коробки. Боб просто предостерегает от использования нарисованной Control.CreateGraphics копии всех новичков с также ужасной страницы примера запуска MSDN. - person TaW; 21.02.2017
comment
@TaW - я обновил ответ из блога Боба (который я могу найти только на обратном пути). Он предостерег от рисования непосредственно на поверхности другого элемента управления. Я думаю, было бы лучше создать экземпляр Graphics из изображения, отображаемого в PictureBox, и вместо этого использовать его. - person Chris Dunaway; 22.02.2017
comment
Хорошо. Что ж, этот «вопрос» явно не дает достаточного контекста; но круг и линия настолько дешевы, что их рисование может привести к проблемам. 1000+ операций - это другой чайник рыбы. Большая часть того, что вы цитируете из того, что пишет Боб, неубедительна; Мне действительно интересно, что он имеет в виду под «багажом». Миф имхо. Поэтому я меняю свой комментарий выше на «но никоим образом не предлагает, чтобы вы не рисовали на PictureBox». - person TaW; 22.02.2017
comment
@TaW - я тоже не уверен на 100% в намерениях Боба. У меня нет опыта использования PictureBox в VB6. Возможно, Боб просто пытался сказать, используйте правильный инструмент для работы! - person Chris Dunaway; 22.02.2017