Основы библиотеки System.Drawing
Пространство имен System.Drawing обеспечивает доступ к функциональным возможностям графического интерфейса GDI+.
Пространства имен:
- System.Drawing.Drawing2D,
- System.Drawing.Imaging,
- System.Drawing.Text
обеспечивают дополнительные функциональные возможности.
Класс Graphics предоставляет методы рисования на устройстве отображения.
Такие классы, как Rectangle и Point, инкапсулируют элементы GDI+.
Класс Pen используется для рисования линий и кривых, а классы, производные от абстрактного класса Brush, используются для заливки фигур.
Инкапсулирует поверхность рисования GDI+. Этот класс не наследуется.
Методов в этом классе огромное количество, поэтому рассмотрим некоторые из них:
Определяет объект, используемый для рисования прямых линий и кривых. Этот класс не наследуется.
Определяет объекты, которые используются для заливки внутри графических фигур, таких как прямоугольники, эллипсы, круги, многоугольники и дорожки.
Это абстрактный базовый класс, который не может быть реализован.Для создания объекта «кисть» используются классы, производные от Brush, такие как SolidBrush, TextureBrush и LinearGradientBrush.
Методы заливки
В C# определены методы заливки фигур. Все методы перегружаемые, то есть выполняются по-разному с разными аргументами.
В примерах заливка разных фигур осуществляется простой кистью с Brush.Cyanи кистью HatchBrush с разными стилями заливкиDashStyle.
FillClosedCurve.
Закрашивает внутренние области замкнутой кривой, проходящей через набор из массива точек (они обозначены точками). Синтаксис метода.
FillClosedCurve – рисуем залитую замкнутую кривую,
p – массив точек.
Получаемый результат зависит от стиля заливки. Рисунок слева использована простая кисть с цветом Cyan. Справа использована кисть, у которой стиль заливки cross (сетка), цвет переднего плана черный, фона белый.

FillRectangle.
Закрашивает прямоугольник. Синтаксис метода.
g.FillRectangle (brush, p);
FillRectangle – рисуем залитый прямоугольник
p – массив точек.
Получаемый результат зависит от стиля заливки. Рисунок слева использована простая кисть с цветом Cyan. Справа использована кисть, у которой стиль заливки BacwardDiagonal(обратная диагональ), цвет переднего плана черный, фона белый.


FillPoligon.
Закрашивает внутренние области полигона, узлы которого совпадают с точками из массива (они обозначены точками).
g. FillPoligon(brush, p);
FillPoligon – рисуем залитый полигон
p – массив точек.
Получаемый результат зависит от стиля заливки. Рисунок слева использована простая кисть с цветом Cyan. Справа использована кисть, у которой стиль заливки ForwardDiagonal(прямая диагональ), цвет переднего плана черный, фона белый.


FillEllipse.
Закрашивает эллипс. Синтаксис метода
g.FillEllipse (brush, rect);
FillEllipse – рисуем залитый эллипс,
rect – прямоугольная область, в которую вписывается эллипс/
Получаемый результат зависит от стиля заливки. Рисунок слева использована простая кисть с цветом Cyan. Справа использована кисть, у которой стиль заливки DiagonalCross(диагональная сетка), цвет переднего плана черный, фона белый.


Закрашивает сектор эллипса. Синтаксис метода
g.FillPie (brush, rect);
FillPie – рисуем залитый сектор эллипса,
rect – прямоугольная область, в которую вписывается эллипс/
Получаемый результат зависит от стиля заливки. Рисунок слева использована простая кисть с цветом Cyan. Справа использована кисть, у которой стиль заливки Cross(сетка), цвет переднего плана черный, фона белый.


Рисование графика функции
Рассмотрим пример программы, которая в форме Windows рисует график синусоиды с текстовым заголовком. Форма включает кнопку с надписью Старт, которая запускает обработчик, выполняющий все операции.
Как закрасить фигуру в c
![]()
Лучший отвечающий
Вопрос
- Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:48 MSDN Forums consolidation (От:Visual C#)
Ответы
Один из способов
Определяем вспомогательный класс, который будет хранить точки границы заливаемой области
Устанавливаем некоторые переменные на уровне формы
Устанавливаем изображения для PictureBox
Связка Mouse Down-Move-Up для рисования на PicrureBox
Строим GraphicsPath и заполняем его цветом
Если границы области задаются каким-то другим способом, то, возможно, придется реализовать собственный алгоритм заливки с помощью GetPixel\SetPixel.
В любом случае общий принцип ясен: строим GraphicsPath для границы и заполняем его
- Помечено в качестве ответа I.Vorontsov 24 июня 2010 г. 7:10
Все ответы
Один из способов
Определяем вспомогательный класс, который будет хранить точки границы заливаемой области
Устанавливаем некоторые переменные на уровне формы
Устанавливаем изображения для PictureBox
Связка Mouse Down-Move-Up для рисования на PicrureBox
Строим GraphicsPath и заполняем его цветом
Если границы области задаются каким-то другим способом, то, возможно, придется реализовать собственный алгоритм заливки с помощью GetPixel\SetPixel.
В любом случае общий принцип ясен: строим GraphicsPath для границы и заполняем его
- Помечено в качестве ответа I.Vorontsov 24 июня 2010 г. 7:10
Проблема в том, что наряду с этой фигурой юзер может закрашивать как отдельные пиксели, так и рисовать кривые, прямые етс.
Т.е. по нажатию левой клавиши мыши пиксель окрашивается в определенный цвет. И если водить мышкой с зажатой левой клавишей, получается попиксельная закраска. Задумка такова: при клике правой клавишей мыши закрашивается вся область ограниченная этим определенным цветом.
Т.е. ситуация может быть такова. Сначала я попиксельно закрашиваю одну область, затем еще несколько пикселей в стороне, затем обвожу контур еще одной области и кликаю внутри нее правой клавишей. Область заливается этим цветом. Если же область "дырявая", тогда "вне область" тоже закрашивается аналогичным способом, минуя замкнутые фигуры этого цвета.
![]()
![]()
На первом рисунке при клике внутри большой фигуры она должна заполняться красным цветом. При клике вне ее должна заполняться вся область кроме замкнутых красных контуров.
На втором рисунке при клике как внутри ее, так и вне, заполняется вся область включая большую фигуру, кроме замкнутых красных контуров. Большая фигура закрашивается, так как она "дырявая".
Рисование контура и закраска области, ограниченной ломаной прямой
В предыдущем примере («Кораблик») мы использовали простые и очевидные методы рисования графических объектов класса Graphics, такие как FillRectangle() — закрасить прямоугольник, FillPie() — закрасить сектор и DrawEllipse() — нарисовать эллипс. Чуть более сложный метод FillPolygon() — закрашенный полигон.
Постановка задачи: «Требуется нарисовать в небе несколько парапланов, имеющих разные цвета и размеры».
Обсуждение. Пусть все парапланы будут геометрически подобны друг другу. Для задания контура параплана нужно задать метод с параметрами, задающими его местоположение и некоторый характерный размер. Для простоты примера будем задавать цвета случайным образом.
Наши действия:
На форме (Form1) размером 900х400 поместим две кнопки «Закрась!» и «Нарисуй!», создадим для них и для Form1 обработчики событий Click.
Нам понадобятся объекты классов Graphics, SolidBrush, Pen, Point (точнее, это структура), Region и GraphicsPath (он задан в библиотеке System.Drawing.Drawing2D — дополнение к System.Drawing!).
Будем применять методы класса Graphics:
FillPath() — заполнить замкнутую область, заданную объектом класса GraphicsPath;
DrawPath() — нарисовать контур (может быть и не замкнутым), заданный объектом класса GraphicsPath;
ExcludeClip() — обновить вырезанную область данного объекта Graphics, чтобы исключить из нее часть, определяемую объектом класса Region, который создается через конструктор
Region gp = new Region(pp); где pp – объект класса GraphicsPath;
ResetClip() — сбросить вырезанную область(ти) и сделать ее бесконечной (условно, анти_ExcludeClip()).
Метод ExcludeClip(Region reg) закрывает для рисования указанную область, оставляя другие части холста видимыми для рисования, а метод ResetClip() отменяет этот запрет.
Полями класса Form1 объявим объекты:
Graphics g; // холст
GraphicsPath pp; // контур фантома-дырки,
pp — объект класса GraphicsPath в System.Drawing.Drawing2D;
SolidBrush br; // кисть
Рисовать будем купол параплана, имеющего разное местоположение и размеры. Его контур зададим объектом класса GraphicsPath, для чего создадим метод:
private GraphicsPath paraplan(int x, int y, int r),
который возвращает контур купола параплана с центром в точке (x,y) и и характерным размером клетки r. Это ломаная прямая, проходящая через 8 точек.
Дополним конструктор Form1(), определим методы: Form1_Click(), button1_Click(), button2_Click().
Метод public Color RandomColor() — «Случайный цвет» является вспомогательным. Он позволит менять цвета контуров и закраски. Написан для демонстрации применения класса Random из библиотеки System.
Примечание: В этом примере мы обошлись одним классом — Form1.
В этот класс, в дополнение ко всем полям, свойствам и методам класса, унаследованных от класса Form, мы добавили в качестве полей три объекта (холст, контур, кисть), дополнили конструктор класса без изменения имени (принцип полиморфизма), добавили три метода обработки событий, а также методы paraplan() и RandomColor().
Остальное вам должно быть понятно из комментариев в тексте программы (файл Form1.cs):
Цвет парапланов меняется при нажатии на кнопки и при клике на форме. Пока не будет нажата кнопка «Закрась», маленький параплан будет сохранять цвет фона. Поэкспериментируйте с программой.

NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.