18.1 Рисование в форме
Графика необходима при организации пользовательского интерфейса. Образы информативнее текста. Framework .Net реализует расширенный графический интерфейс GDI+, обладающий широким набором возможностей. Но для рисования в формах достаточно иметь три объекта — перо, кисть и, хочется сказать, бумагу, но третий нужный объект — это объект класса Graphics, методы которого позволяют в формах заниматься графикой — рисовать и раскрашивать. Класс Graphics — это основной класс, необходимый для рисования. Класс Graphics, так же, как и другие рассматриваемые здесь классы для перьев и кистей, находятся в пространстве имен Drawing, хотя классы некоторых кистей вложены в подпространство Drawing2D. Объекты этого класса зависят от контекста устройства, (графика не обязательно отображается на дисплее компьютера, она может выводиться на принтер, графопостроитель или другие устройства), поэтому создание объектов класса Graphics выполняется не традиционным способом — без вызова конструкторакласса. Создаются объекты специальными методами разных классов. Например, метод CreateGraphics класса Control — наследника класса Form — возвращает объект, ассоциированный с выводом графики на форму. При рисовании в формах можно объявить в форме поле, описывающее объект класса Graphics: Graphics graph; а в конструктореформы произвести связывание с реальным объектом: graph = CreateGraphics(); Затем всюду в программе, где нужно работать с графикой, используется глобальный для формы объект graph и его методы. Есть другой способ получения этого объекта — обработчики некоторых событий получают объект класса Graphics среди передаваемых им аргументов. Например, в обработчике события Paint, занимающегося перерисовкой, этот объект можно получить так: protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) < Graphics gr = e.Graphics; //перерисовка, использующая методы объекта gr >Для получения этого объекта можно использовать и статические методы самого класса Graphics. У класса Graphics большое число методов и свойств. Для рисования наиболее важны три группы методов. К первой относится перегруженный метод DrawString, позволяющий выводить тексты в графическом режиме. Вторую группу составляют методы Draw — DrawEllipse, DrawLine, DrawArc и другие, позволяющие цветным пером (объектом класса Pen) рисовать геометрические фигуры: линии, различные кривые, прямоугольники, многоугольники, эллипсы и прочее. К третьей группе относятся методы Fill — FillEllipse, FillPie, FillRectangle и другие, позволяющие нарисовать и закрасить фигуру кистью. Кисти (объекты классов, производных от Brush), могут быть разные — сплошные, узорные, градиентные. Методам группы Draw класса Graphics, рисующим контур фигуры, нужно передать перо — объект класса Pen. В конструкторе этого класса можно задать цвет пера и его толщину (чаще говорят «ширину пера»). Цвет задается объектом класса (структурой) Color. Для выбора подходящего цвета можно использовать упоминавшееся выше диалоговое окно Color либо одно из многочисленных статических свойств класса Color, возвращающее требуемый цвет. Возможно и непосредственное задание элементов структуры в виде комбинации RGB — трех цветов — красного, зеленого и голубого. Вместо создания нового пера с помощью конструктора можно использовать специальный класс предопределенных системных перьев. Класс Brush, задающий кисти, устроен более сложно. Класс Brush является абстрактным классом, так что создавать кисти этого класса нельзя, но можно создавать кисти классов-потомков Brush. Таких классов пять — они задают кисть:
- SolidBrush — для сплошной закраски области заданным цветом;
- TextureBrush — для закраски области заданной картинкой (image);
- HatchBrush — для закраски области предопределенным узором;
- LinearGradientBrush — для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается линейным градиентом;
- PathGradientBrush — для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается более сложным путем.
Первые два класса кистей находятся в пространстве имен System.Drawing, остальные — в System.Drawing.Drawing2D. Создадим в нашем проекте новую форму RandomShapes, в которой будем рисовать и закрашивать геометрические фигуры трех разных типов — эллипсы, сектора, прямоугольники. Для каждого типа фигуры будем использовать свой тип кисти: эллипсы будем закрашивать градиентной кистью, сектора — сплошной, а прямоугольники — узорной. Цвет фигуры, ее размеры и положение будем выбирать случайным образом. Рисование фигур будет инициироваться в обработчике события Click. При каждом щелчке кнопкой мыши на форме будут рисоваться три новых экземпляра фигур каждого типа. Приведем программный код, реализующий рисование. Начнем, как обычно, с полей класса: //fields int cx,cy; Graphics graph; Brush brush; Color color; Random rnd; Инициализация полей производится в методе MyInit, вызываемом конструкторомкласса: void MyInit() < cx = ClientSize.Width; cy = ClientSize.Height; graph = CreateGraphics(); rnd = new Random(); >Рассмотрим теперь основной метод, реализующий рисование фигур различными кистями: void DrawShapes() < for(int i=0; i//градиентной кистью рисуется эллипс, //местоположение случайно Point top = new Point(rnd.Next(cx), rnd.Next(cy)); Size sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y)); Rectangle rct = new Rectangle(top, sz); Point bottom = top + sz; brush = new LinearGradientBrush(top, bottom, Color.White,color); graph.FillEllipse(brush,rct); //сплошной кистью рисуется сектор, //местоположение случайно top = new Point(rnd.Next(cx), rnd.Next(cy)); sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y)); rct = new Rectangle(top, sz); brush = new SolidBrush(color); graph.FillPie(brush,rct,30f,60f); //узорной кистью рисуется прямоугольник, //местоположение случайно top = new Point(rnd.Next(cx), rnd.Next(cy)); sz = new Size(rnd.Next(cx-top.X), rnd.Next(cy-top.Y)); rct = new Rectangle(top, sz); HatchStyle hs = (HatchStyle)rnd.Next(52); brush = new HatchBrush(hs,Color.White, Color.Black); graph.FillRectangle(brush,rct); > > Здесь многое построено на работе со случайными числами. Случайным образом выбирается один из возможных цветов для рисования фигуры, ее размеры и положение. Наиболее интересно рассмотреть создание кистей разного типа. Когда создается градиентная кисть. brush = new LinearGradientBrush(top, bottom, Color.White,color); то нужно в конструкторе кисти задать две точки и два цвета. Точки определяют интервал изменения оттенков цвета от первого до второго. В начальной точке имеет место первый цвет, в конечной — второй, в остальных точках — их комбинация. Разумно, как это сделано у нас, в качестве точек выбирать противоположные углы прямоугольника, ограничивающего рисуемую фигуру. Наиболее просто задается сплошная кисть: brush = new SolidBrush(color); Для нее достаточно указать только цвет. Для узорной кисти нужно задать предопределенный тип узора, всего их возможно 52. В нашем примере тип узора выбирается случайным образом: HatchStyle hs = (HatchStyle)rnd.Next(52); brush = new HatchBrush(hs,Color.White, Color.Black); Помимо первого аргумента, задающего тип узора, указываются еще два цвета — первый определяет цвет повторяющегося элемента, второй — цвет границы между элементами узора. Непосредственное рисование кистью осуществляют методы группы Fill: graph.FillEllipse(brush,rct); graph.FillPie(brush,rct,30f,60f); graph.FillRectangle(brush,rct); Первый аргумент всегда задает кисть, а остальные зависят от типа рисуемой фигуры. Как правило, всегда задается прямоугольник, ограничивающий данную фигуру. Вызов метода DrawShapes, как уже говорилось, встроен в обработчик события Click формы RandomShapes: private void RandomShapes_Click(object sender, System.EventArgs e) < DrawShapes(); >
22.11.2019 400.9 Кб 1 Лекции по макроэкономике.doc
24.09.2019 617.47 Кб 4 Лекции по ЭкТ.doc
18.02.2016 523.26 Кб 51 Лекции по ЭкТ.doc
05.05.2019 1.03 Mб 4 лекции-Иванова-Щица.doc
18.02.2016 364.62 Кб 34 Лекции.docx
15.11.2018 2.72 Mб 18 Лекции_C#.doc
26.11.2018 595.64 Кб 7 лекционные занятия.docx
15.08.2019 376.32 Кб 11 Лекция 17 ПРЕССОВАНИЕ.doc
15.08.2019 124.23 Кб 27 Лекция 17Механика сыпучих сред (Автосохраненн. docx
17.04.2019 437.25 Кб 3 Лекция 1 — Элементы фотометрии.doc
18.02.2016 201.22 Кб 14 Лекция 1 ОС .doc
Ограничение
Для продолжения скачивания необходимо пройти капчу:
Какой класс задает кисть для закраски области предопределенным узором

Кисть — важный инструмент при создании графических изображений и дизайна. Один из важных аспектов работы с кистью — возможность выбора определенного узора или текстуры для закрашивания области.
Для выбора нужного узора в графическом редакторе понадобится знание различных классов кистей. От выбора правильного класса будет зависеть эффект, который вы хотите достичь в своей работе.
Классы кистей определяются в зависимости от вида узора, который можно использовать. Среди них есть классические кисти, которые имитируют различные виды ручек, карандашей или кистей для живописи. Также существуют специализированные кисти, которые создают сложные узоры, градиенты или текстуры.
Выбор класса кисти зависит от ваших личных предпочтений и задачи, которую вы пытаетесь решить. Если вы хотите создать реалистичную текстуру или имитацию определенного материала, такого как дерево или металл, то вам понадобится специальный класс кисти для текстурирования.
Кисти для узоров также могут быть использованы для создания сложных фонов, декоративных элементов или орнаментов. В зависимости от задачи, может потребоваться выбрать класс кисти с определенным узором, который будет повторяться при закрашивании области.
Независимо от выбранного класса кисти, важно помнить, что узоры и текстуры могут быть настраиваемыми. Вы можете изменять размер, прозрачность, цвет и другие параметры класса кисти, чтобы достичь желаемого визуального эффекта.
Выбор класса для кисти для закрашивания определенного узора
При выборе класса для кисти, который позволит закрасить область определенным узором, необходимо учесть несколько факторов:
- Тип узора. В первую очередь необходимо определить, какой тип узора вы хотите создать. Некоторые классы кистей предоставляют различные варианты узоров, такие как линии, точки, сплошные и прерывистые узоры и многое другое. Учтите, что разные классы могут предлагать разные варианты, поэтому исследуйте возможности каждого класса кисти перед выбором.
- Размер и форма кисти. Класс кисти может иметь различные размеры и формы, которые могут влиять на общий вид и детализацию узора. Если вы хотите создать узор с мелкими деталями, вам может потребоваться выбрать кисть с маленьким размером и острым концом. Если же вы хотите создать более крупные и грубые узоры, вам следует выбрать кисть с большими размерами и более широкой формой.
- Материал кисти. Помимо размера и формы, материал кисти также может влиять на результат вашего узора. Кисти из натуральных волос, таких как кисти из козьего или белкиного хвоста, могут обеспечивать более мягкий и растушеванный узор, в то время как кисти из синтетических волокон могут создавать более резкие и четкие линии.
Важно помнить, что выбор класса для кисти для закрашивания определенного узора является вопросом индивидуальных предпочтений и опыта каждого художника. Рекомендуется экспериментировать с различными классами кистей и их сочетаниями, чтобы найти наиболее подходящий вариант для создания интересного и уникального узора.
Как выбрать класс для кисти
При выборе класса для кисти, необходимо учитывать цель и характеристики будущего рисунка. Как правило, все кисти имеют свои особенности и предназначены для выполнения определенных задач.
- Акварельные кисти — отлично подходят для создания растушеванных и объемных рисунков. Их высокое волокнистое покрытие помогает наносить краску равномерно и делает рисунок мягким и нежным.
- Акриловые кисти — предназначены для работы с акриловыми красками. Они имеют более твердое и жесткое волокно, что позволяет легко контролировать нанесение краски и создавать более четкие линии и детали.
- Масляные кисти — используются для работы с масляными красками. Они имеют круглое или плоское волокно, которое позволяет наносить краску более плотными и насыщенными слоями.
Важно учитывать также размер кисти, который определяет ширину и точность нанесения краски. Для крупных и быстрых работ лучше использовать кисти большого размера, а для работы с мелкими деталями — маленькие и тонкие кисточки.
Кроме класса и размера, можно также обратить внимание на форму и тип волокна кисти. Конические и круглые волокна подходят для рисования линий и кругов, плоские волокна — для создания широких пятен и заливки больших площадей, а филберт (плоский с закругленными краями) может быть полезен для создания плавных переходов между цветами.
| Класс кисти | Предназначение | Особенности |
|---|---|---|
| Акварельные кисти | Создание растушеванных и объемных рисунков | Высокое волокнистое покрытие, мягкий рисунок |
| Акриловые кисти | Работа с акриловыми красками | Жесткое волокно, контроль нанесения краски |
| Масляные кисти | Работа с масляными красками | Плотные и насыщенные слои краски |
В итоге, выбор класса для кисти зависит от ваших личных предпочтений, стиля рисования и задачи, которую вы хотите решить. Определитесь с тем, какой эффект вы хотите достичь, и выберите подходящий класс кисти для вашего творчества.
Как закрасить область определенным узором
Для того чтобы закрасить область определенным узором на поверхности, вы можете использовать специальные кисти. Кисти позволяют наносить различные узоры, рисунки и текстуры на различные материалы, такие как бумага, ткань, дерево и другие.
Для создания интересных узоров существует много разных видов кистей. Каждая кисть имеет свою форму, размер и текстуру, что позволяет создавать разнообразные эффекты и узоры.
Вот некоторые из популярных классов кистей, которые можно использовать для закраски области определенным узором:
- Круглые кисти: эти классические кисти имеют круглую форму и идеально подходят для создания простых узоров и закрашивания малых и больших областей.
- Широкие плоские кисти: эти кисти имеют плоскую форму и широкую поверхность, позволяющую создавать широкие полосы и узкие линии.
- Скошенные кисти: эти кисти имеют скошенную форму и идеально подходят для создания линий разной ширины и угла наклона. Они особенно полезны для создания узоров с острыми углами.
- Флористические кисти: эти кисти имеют специальные формы для создания узоров, напоминающих цветы, листья и другие растения. Они часто используются в декоративной живописи.
- Штамповочные кисти: эти кисти имеют текстуру, позволяющую создавать узоры, похожие на штампы или отпечатки. Они особенно полезны для создания реалистических текстур и фактур.
При выборе кисти для создания определенного узора, важно учитывать материал, на котором будет наноситься узор, а также желаемый эффект. Некоторые кисти могут быть более подходящими для определенных поверхностей или стилей рисунка.
Используя различные классы кистей и экспериментируя с разными узорами, вы сможете создавать уникальные и креативные работы.
Какой класс использовать для создания узора
При создании узора на кисти есть несколько классов, которые могут быть использованы для достижения нужного эффекта.
1. TextureBrush
Класс TextureBrush предоставляет возможность использования текстур для закрашивания областей. Вы можете выбрать готовую текстуру или создать свою собственную с помощью методов класса TextureBrush.
2. HatchBrush
Класс HatchBrush позволяет создавать узоры, используя предопределенные шаблоны. Вы можете выбрать один из доступных шаблонов, таких как горизонтальные линии, вертикальные линии, клетка и т.д., и настроить его параметры при необходимости.
3. LinearGradientBrush
Класс LinearGradientBrush позволяет создавать узоры, которые основаны на линейных градиентах. Вы можете задать начальный и конечный цвета градиента, а также угол наклона градиента. Кроме того, вы можете настроить прозрачность и цикличность градиента.
4. PathGradientBrush
Класс PathGradientBrush позволяет создавать узоры, которые основаны на градиентах по контуру. Вы можете задать контур, по которому будет распространяться градиент, а также задать центр и радиус градиента. Кроме того, вы можете настроить прозрачность и цветовую палитру градиента.
5. ImageBrush
Класс ImageBrush позволяет использовать изображение в качестве узора для закрашивания областей. Вы можете выбрать готовое изображение или создать свое собственное, а также настроить параметры закрашивания и поворот изображения.
Выбор конкретного класса зависит от требуемого эффекта и ваших личных предпочтений. Комбинирование различных классов может помочь в создании уникального и интересного узора на кисти. Поэтому рекомендуется экспериментировать с разными классами и настройками, чтобы найти наилучший вариант для вашего узора.
Особенности классов для создания узоров
При выполнении задачи по созданию узоров при помощи кисти важно выбрать правильный класс, который будет обеспечивать нужную функциональность и эффект. Особенности классов для создания узоров могут варьироваться в зависимости от программного обеспечения или инструмента, используемого для работы.
Вот некоторые особенности классов, которые следует учесть при выборе класса для создания узоров:
- Тип кисти: Классы для создания узоров могут иметь различные типы кистей, такие как обычная кисть, распылитель, мазок и т. д. Выбор типа кисти зависит от желаемого эффекта и стиля узора.
- Размер кисти: Классы для создания узоров часто предлагают различные размеры кисти. Более крупные размеры могут давать более быстрый и грубый заполнитель, в то время как меньшие размеры кисти позволяют более тонкую детализацию узора.
- Прозрачность: Некоторые классы могут иметь возможность регулировки прозрачности кисти. Это позволяет создавать узоры с различными уровнями непрозрачности, что может быть полезным для создания эффектов перекрытия и градиентов.
- Текстура: Некоторые классы могут предлагать возможность применения текстуры к кисти, что может добавить особый вид или фактуру к узору.
- Сложные формы и шаблоны: Некоторые классы для создания узоров могут поддерживать использование сложных форм и шаблонов. Это позволяет создавать узоры с более сложной геометрией и детализацией.
При выборе класса для создания узоров рекомендуется ознакомиться с особенностями и возможностями каждого класса, а также провести тестирование и эксперименты для достижения желаемого результата.
Вопрос-ответ
Какой класс выбрать для кисти, чтобы закрасить область определенным узором?
Для закрашивания области определенным узором нужно выбрать класс PatternBrush.
Как подобрать класс кисти для создания сложного узора на рисунке?
Для создания сложного узора на рисунке следует использовать класс CustomBrush, который позволяет настраивать форму и расположение узора.
Как создать кисть с текстурой для закрашивания определенной области на изображении?
Для создания кисти с текстурой для закрашивания определенной области на изображении можно использовать класс TextureBrush. Нужно выбрать нужную текстуру и настроить ее параметры.
Какой класс использовать для создания кисти с градиентом для закрашивания области на рисунке?
Для создания кисти с градиентом для закрашивания области на рисунке можно использовать класс LinearGradientBrush. Этот класс позволяет создавать градиент, настраивать его направление и цвета.
Общие сведения о кистях WPF
Все, что видно на экране, отображается, так как нарисовано с помощью кисти. Например, кисть используется для описания фона кнопки, переднего плана текста и заливки фигуры. В этом разделе приводятся основные понятия рисования с помощью кистей Windows Presentation Foundation (WPF) и приведены примеры. Кисти позволяют рисовать объекты пользовательского интерфейса с помощью простых, сплошных цветов до сложных наборов шаблонов и изображений.
Закрашивание с помощью кисти
Brush закрашивает область своими выходными данными. Разные кисти имеют разные типы выходных данных. Некоторые кисти заполняют область сплошным цветом, другие — градиентом, узором, изображением или рисунком. На следующем рисунке показаны примеры каждого из различных типов Brush.

Примеры кистей
Большинство визуальных объектов позволяют указать, как именно они закрашиваются. В следующей таблице перечислены некоторые распространенные объекты и свойства, с которыми можно использовать Brush.
| Класс | Свойства кисти |
|---|---|
| Border | BorderBrush, Background |
| Control | Background, Foreground |
| Panel | Background |
| Pen | Brush |
| Shape | Fill, Stroke |
| TextBlock | Background |
В следующих разделах описаны различные типы Brush и приведен пример каждого из них.
Закрашивание сплошным цветом
SolidColorBrush закрашивает область сплошным цветом Color. Существует множество способов указать Color объекта SolidColorBrush: например, можно указать альфа-канал и каналы красного, синего и зеленого цветов или использовать один из предопределенных цветов, предоставляемых классом Colors.
В следующем примере используется SolidColorBrush для закрашивания Fill объекта Rectangle. На следующем рисунке показан закрашенный прямоугольник.

Прямоугольник, закрашенный с помощью SolidColorBrush
Rectangle exampleRectangle = new Rectangle(); exampleRectangle.Width = 75; exampleRectangle.Height = 75; // Create a SolidColorBrush and use it to // paint the rectangle. SolidColorBrush myBrush = new SolidColorBrush(Colors.Red); exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle() exampleRectangle.Width = 75 exampleRectangle.Height = 75 ' Create a SolidColorBrush and use it to ' paint the rectangle. Dim myBrush As New SolidColorBrush(Colors.Red) exampleRectangle.Fill = myBrush
Закрашивание с линейным градиентом
LinearGradientBrush закрашивает область с линейным градиентом. Линейный градиент объединяет два или более цветов по линии, градиентная ось. Объекты GradientStop используются для указания цветов в градиенте и их положения.
В следующем примере используется LinearGradientBrush для закрашивания Fill объекта Rectangle. На следующем рисунке показан закрашенный прямоугольник.

Прямоугольник, закрашенный с помощью LinearGradientBrush
Rectangle exampleRectangle = new Rectangle(); exampleRectangle.Width = 75; exampleRectangle.Height = 75; // Create a LinearGradientBrush and use it to // paint the rectangle. LinearGradientBrush myBrush = new LinearGradientBrush(); myBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.0)); myBrush.GradientStops.Add(new GradientStop(Colors.Orange, 0.5)); myBrush.GradientStops.Add(new GradientStop(Colors.Red, 1.0)); exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle() exampleRectangle.Width = 75 exampleRectangle.Height = 75 ' Create a LinearGradientBrush and use it to ' paint the rectangle. Dim myBrush As New LinearGradientBrush() myBrush.GradientStops.Add(New GradientStop(Colors.Yellow, 0.0)) myBrush.GradientStops.Add(New GradientStop(Colors.Orange, 0.5)) myBrush.GradientStops.Add(New GradientStop(Colors.Red, 1.0)) exampleRectangle.Fill = myBrush
Закрашивание с применением радиального градиента
RadialGradientBrush закрашивает область с применением радиального градиента. Радиальный градиент смешивает два или более цветов вдоль окружности. Как и в случае с классом LinearGradientBrush, объекты GradientStop используются для указания цветов в градиенте и их положения.
В следующем примере используется RadialGradientBrush для закрашивания Fill объекта Rectangle. На следующем рисунке показан закрашенный прямоугольник.

Прямоугольник, закрашенный с использованием RadialGradientBrush
Rectangle exampleRectangle = new Rectangle(); exampleRectangle.Width = 75; exampleRectangle.Height = 75; // Create a RadialGradientBrush and use it to // paint the rectangle. RadialGradientBrush myBrush = new RadialGradientBrush(); myBrush.GradientOrigin = new Point(0.75, 0.25); myBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.0)); myBrush.GradientStops.Add(new GradientStop(Colors.Orange, 0.5)); myBrush.GradientStops.Add(new GradientStop(Colors.Red, 1.0)); exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle() exampleRectangle.Width = 75 exampleRectangle.Height = 75 ' Create a RadialGradientBrush and use it to ' paint the rectangle. Dim myBrush As New RadialGradientBrush() myBrush.GradientOrigin = New Point(0.75, 0.25) myBrush.GradientStops.Add(New GradientStop(Colors.Yellow, 0.0)) myBrush.GradientStops.Add(New GradientStop(Colors.Orange, 0.5)) myBrush.GradientStops.Add(New GradientStop(Colors.Red, 1.0)) exampleRectangle.Fill = myBrush
Закрашивание с помощью изображения
ImageBrush закрашивает область с использованием ImageSource.
В следующем примере используется ImageBrush для закрашивания Fill объекта Rectangle. На следующем рисунке показан закрашенный прямоугольник.

Прямоугольник, закрашенный с использованием изображения
Rectangle exampleRectangle = new Rectangle(); exampleRectangle.Width = 75; exampleRectangle.Height = 75; // Create an ImageBrush and use it to // paint the rectangle. ImageBrush myBrush = new ImageBrush(); myBrush.ImageSource = new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative)); exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle() exampleRectangle.Width = 75 exampleRectangle.Height = 75 ' Create an ImageBrush and use it to ' paint the rectangle. Dim myBrush As New ImageBrush() myBrush.ImageSource = New BitmapImage(New Uri("sampleImages\pinkcherries.jpg", UriKind.Relative)) exampleRectangle.Fill = myBrush
Закрашивание с помощью рисунка
DrawingBrush закрашивает область с использованием Drawing. Drawing может содержать фигуры, изображения, текст и мультимедиа.
В следующем примере используется DrawingBrush для закрашивания Fill объекта Rectangle. На следующем рисунке показан закрашенный прямоугольник.

Прямоугольник, закрашенный с помощью DrawingBrush
Rectangle exampleRectangle = new Rectangle(); exampleRectangle.Width = 75; exampleRectangle.Height = 75; // Create a DrawingBrush and use it to // paint the rectangle. DrawingBrush myBrush = new DrawingBrush(); GeometryDrawing backgroundSquare = new GeometryDrawing( Brushes.White, null, new RectangleGeometry(new Rect(0, 0, 100, 100))); GeometryGroup aGeometryGroup = new GeometryGroup(); aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50))); aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50))); LinearGradientBrush checkerBrush = new LinearGradientBrush(); checkerBrush.GradientStops.Add(new GradientStop(Colors.Black, 0.0)); checkerBrush.GradientStops.Add(new GradientStop(Colors.Gray, 1.0)); GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, aGeometryGroup); DrawingGroup checkersDrawingGroup = new DrawingGroup(); checkersDrawingGroup.Children.Add(backgroundSquare); checkersDrawingGroup.Children.Add(checkers); myBrush.Drawing = checkersDrawingGroup; myBrush.Viewport = new Rect(0, 0, 0.25, 0.25); myBrush.TileMode = TileMode.Tile; exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle() exampleRectangle.Width = 75 exampleRectangle.Height = 75 ' Create a DrawingBrush and use it to ' paint the rectangle. Dim myBrush As New DrawingBrush() Dim backgroundSquare As New GeometryDrawing(Brushes.White, Nothing, New RectangleGeometry(New Rect(0, 0, 100, 100))) Dim aGeometryGroup As New GeometryGroup() aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(0, 0, 50, 50))) aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(50, 50, 50, 50))) Dim checkerBrush As New LinearGradientBrush() checkerBrush.GradientStops.Add(New GradientStop(Colors.Black, 0.0)) checkerBrush.GradientStops.Add(New GradientStop(Colors.Gray, 1.0)) Dim checkers As New GeometryDrawing(checkerBrush, Nothing, aGeometryGroup) Dim checkersDrawingGroup As New DrawingGroup() checkersDrawingGroup.Children.Add(backgroundSquare) checkersDrawingGroup.Children.Add(checkers) myBrush.Drawing = checkersDrawingGroup myBrush.Viewport = New Rect(0, 0, 0.25, 0.25) myBrush.TileMode = TileMode.Tile exampleRectangle.Fill = myBrush
Закрашивание с помощью визуального элемента
VisualBrush закрашивает область объектом Visual. Примеры визуальных объектов: Button, Page и MediaElement. Кроме того, VisualBrush позволяет проецировать содержимое из одной части приложения в другую область, это очень удобно для создания эффектов отражения и увеличения частей экрана.
В следующем примере используется VisualBrush для закрашивания Fill объекта Rectangle. На следующем рисунке показан закрашенный прямоугольник.

Прямоугольник, закрашенный с использованием VisualBrush
Rectangle exampleRectangle = new Rectangle(); exampleRectangle.Width = 75; exampleRectangle.Height = 75; // Create a VisualBrush and use it // to paint the rectangle. VisualBrush myBrush = new VisualBrush(); // // Create the brush's contents. // StackPanel aPanel = new StackPanel(); // Create a DrawingBrush and use it to // paint the panel. DrawingBrush myDrawingBrushBrush = new DrawingBrush(); GeometryGroup aGeometryGroup = new GeometryGroup(); aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50))); aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50))); RadialGradientBrush checkerBrush = new RadialGradientBrush(); checkerBrush.GradientStops.Add(new GradientStop(Colors.MediumBlue, 0.0)); checkerBrush.GradientStops.Add(new GradientStop(Colors.White, 1.0)); GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, aGeometryGroup); myDrawingBrushBrush.Drawing = checkers; aPanel.Background = myDrawingBrushBrush; // Create some text. TextBlock someText = new TextBlock(); someText.Text = "Hello, World"; FontSizeConverter fSizeConverter = new FontSizeConverter(); someText.FontSize = (double)fSizeConverter.ConvertFromString("10pt"); someText.Margin = new Thickness(10); aPanel.Children.Add(someText); myBrush.Visual = aPanel; exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle() exampleRectangle.Width = 75 exampleRectangle.Height = 75 ' Create a VisualBrush and use it ' to paint the rectangle. Dim myBrush As New VisualBrush() ' ' Create the brush's contents. ' Dim aPanel As New StackPanel() ' Create a DrawingBrush and use it to ' paint the panel. Dim myDrawingBrushBrush As New DrawingBrush() Dim aGeometryGroup As New GeometryGroup() aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(0, 0, 50, 50))) aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(50, 50, 50, 50))) Dim checkerBrush As New RadialGradientBrush() checkerBrush.GradientStops.Add(New GradientStop(Colors.MediumBlue, 0.0)) checkerBrush.GradientStops.Add(New GradientStop(Colors.White, 1.0)) Dim checkers As New GeometryDrawing(checkerBrush, Nothing, aGeometryGroup) myDrawingBrushBrush.Drawing = checkers aPanel.Background = myDrawingBrushBrush ' Create some text. Dim someText As New TextBlock() someText.Text = "Hello, World" Dim fSizeConverter As New FontSizeConverter() someText.FontSize = CDbl(fSizeConverter.ConvertFromString("10pt")) someText.Margin = New Thickness(10) aPanel.Children.Add(someText) myBrush.Visual = aPanel exampleRectangle.Fill = myBrush
Hello, World!
Закрашивание с помощью предопределенных и системных кистей
Для удобства Windows Presentation Foundation (WPF) предоставляет набор предопределенных и системных кистей, которые можно использовать для закрашивания объектов.
- Список доступных предопределенных кистей см. в описании класса Brushes. Пример использования предопределенной кисти см. в разделе Закраска области сплошным цветом.
- Список доступных системных кистей см. в описании класса SystemColors. Пример см. в разделе Закраска области с помощью системной кисти.
Общие функции кисти
Объекты Brush предоставляют Opacity свойство, которое можно использовать, чтобы сделать кисть полностью или частично прозрачной. Свойство Opacity, равное 0, делает кисть полностью прозрачной, а Opacity, равное 1, делает ее полностью непрозрачной. В следующем примере свойство Opacity используется для того, чтобы сделать кисть SolidColorBrush непрозрачной на 25 процентов.
Rectangle myRectangle = new Rectangle(); myRectangle.Width = 100; myRectangle.Height = 100; SolidColorBrush partiallyTransparentSolidColorBrush = new SolidColorBrush(Colors.Blue); partiallyTransparentSolidColorBrush.Opacity = 0.25; myRectangle.Fill = partiallyTransparentSolidColorBrush;
Если кисть содержит частично прозрачные цвета, значение непрозрачности цвета посредством умножения объединяется со значением непрозрачности кисти. Например, если кисть имеет значение непрозрачности 0,5, а цвет, используемый в кисти, также имеет значение непрозрачности 0,5, на выходе цвет имеет значение непрозрачности 0,25.
Эффективнее изменить значение непрозрачности кисти, чем менять непрозрачность всего элемента с помощью его свойства UIElement.Opacity.
Вы можете повернуть, масштабировать, наклонить и преобразовать содержимое кисти с помощью ее свойств Transform или RelativeTransform. Дополнительные сведения см. в разделе Общие сведения о преобразованиях кистей.
Поскольку они являются объектами Animatable, объекты Brush могут быть анимированы. Более подробную информацию см. в разделе Общие сведения об эффектах анимации.
Возможности объектов Freezable
Так как он наследует от класса Freezable, класс Brush предоставляет ряд особых возможностей: можно объявлять объекты Brush как ресурсы, разделять их между несколькими объектами и клонировать. Кроме того, все типы Brush, кроме VisualBrush, можно сделать доступными только для чтения, чтобы повысить производительность, и потокобезопасными.
Дополнительные сведения о различных функциях, предоставляемых объектами Freezable, см. в разделе Общие сведения об объектах класса Freezable.
Дополнительные сведения о том, почему объекты VisualBrush не могут быть зафиксированы, см. на странице типа VisualBrush.
См. также
- Brush
- Brushes
- Общие сведения о закраске сплошным цветом и градиентом
- Рисование с помощью объектов Image, Drawing и Visual
- Общие сведения об объектах класса Freezable
- Пример использования кистей
- Пример использования ImageBrush
- Пример использования VisualBrush
- Практические руководства
- Дополнительные рекомендации по повышению производительности
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
.NET Desktop feedback
The .NET Desktop documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
Организация интерфейса и рисование в формах
У класса Graphics большое число методов и свойств. Упомяну лишь о некоторых из них. Группа статических методов класса позволяет создать объект этого класса , задавая, например, описатель (handle) контекста устройства.
Для рисования наиболее важны три группы методов. К первой относится перегруженный метод DrawString , позволяющий выводить тексты в графическом режиме . Вторую группу составляют методы Draw — DrawEllipse , DrawLine , DrawArc и другие, позволяющие цветным пером (объектом класса Pen ) рисовать геометрические фигуры : линии, различные кривые, прямоугольники, многоугольники, эллипсы и прочее. К третьей группе относятся методы Fill — FillEllipse , FillPie , FillRectangle и другие, позволяющие нарисовать и закрасить фигуру кистью. Кисти (объекты классов , производных от Brush ), могут быть разные — сплошные, узорные, градиентные.
Класс Pen
Методам группы Draw класса Graphics , рисующим контур фигуры, нужно передать перо — объект класса Pen . В конструкторе этого класса можно задать цвет пера и его толщину (чаще говорят «ширину пера»). Цвет задается объектом класса (структурой) Color . Для выбора подходящего цвета можно использовать упоминавшееся выше диалоговое окно Color либо одно из многочисленных статических свойств класса Color , возвращающее требуемый цвет. Возможно и непосредственное задание элементов структуры в виде комбинации RGB — трех цветов — красного, зеленого и голубого. Вместо создания нового пера с помощью конструктора можно использовать специальный класс предопределенных системных перьев.
Класс Brush
Класс Brush , задающий кисти, устроен более сложно. Начну с того, что класс Brush является абстрактным классом , так что создавать кисти этого класса нельзя, но можно создавать кисти классов-потомков Brush . Таких классов пять — они задают кисть:
- SolidBrush — для сплошной закраски области заданным цветом;
- TextureBrush — для закраски области заданной картинкой (image);
- HatchBrush — для закраски области предопределенным узором;
- LinearGradientBrush — для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается линейным градиентом;
- PathGradientBrush — для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается более сложным путем.
Первые два класса кистей находятся в пространстве имен System.Drawing , остальные — в System.Drawing.Drawing2D .
У каждого из этих классов свои конструкторы . В примере, обсуждаемом далее, рассмотрим создание кистей трех разных классов , там и поговорим о конструкторах классов .
Проект «Паутина Безье, кисти и краски»
Построим проект для рисования в формах . В одной из форм будем рисовать пером, в другом — кистями различного типа. Главную форму сделаем простой кнопочной формой . Вот как она выглядит.
Рис. 24.13. Кнопочная форма «кисть или перо»
Выбор соответствующей командной кнопки открывает форму для рисования пером или кистью.
Паутина Безье
В форме BezierWeb будем рисовать несколько кривых Безье , исходящих из одной точки — центра. Положение центра определяется курсором. Перемещая мышь, меняем положение курсора, а, следовательно, и центра, так что рисунок в форме будет все время перерисовываться, следуя за мышью. ( кривые Безье — это широко используемый в графике и технических приложениях вид гладких кривых. Кривая Безье задается четырьмя точками, первая и последняя из которых являются начальной и конечной точками кривой. Две оставшиеся точки являются точками притяжения. Прямую, заданную началом и концом, они притягивают к себе, превращая ее в гладкую кривую. Строгое математическое определение несложно, но мы приводить его не будем.)
Прежде чем рассмотреть программный код, давайте посмотрим, как выглядят нарисованные программой кривые Безье , исходящие из одной точки.
Рис. 24.14. Паутина Безье
Перейдем к рассмотрению кода. Первым делом добавим в поля формы нужные нам объекты:
//fields Point center; Point[] points = new Point[10]; Pen pen; Graphics graph; int count;
Точка center будет задавать общую начальную точку для всех рисуемых кривых Безье , массив points будет задавать остальные точки, используемые при построении кривых Безье . О роли объектов pen и graph , необходимых при рисовании , уже говорилось. Объект count играет техническую роль, о которой скажу чуть позже, прямого отношения к рисованию он не имеет.
В конструкторе формы вызывается метод MyInit , инициализирующий введенные объекты:
void MyInit() < int cx = ClientSize.Width; int cy = ClientSize.Height; points[0] = new Point(0,0); points[1] = new Point(cx/2,0); points[2] = new Point(cx,0); points[3] = new Point(0,cy/2); points[4] = new Point(cx,cy/2); points[5] = new Point(0,cy); points[6] = new Point(cx/2,cy); points[7] = new Point(cx,cy); points[8] = new Point(0,0); points[9] = new Point(cx/2,0); graph = this.CreateGraphics(); center = new Point(cx/2,cy/2); count =1; >
Рисование кривых Безье выполняется в методе DrawWeb , устроенном очень просто. В цикле рисуется 8 кривых, используя точку center и массив points :
void DrawWeb()
Метод DrawBezier , вызываемый объектом graph класса Graphics , принадлежит группе рассмотренных нами методов Draw . Первым аргументом у всех этих методов является объект класса Pen , а остальные зависят от типа рисуемой фигуры. Для кривой Безье , как уже говорилось, необходимо задать четыре точки.
Главный вопрос, требующий решения: где же вызывать сам метод DrawWeb , где инициализировать рисование в форме ? Будем вызывать этот метод в двух местах — в двух обработчиках событий . Поскольку нам хочется реализовать стратегию, по которой точка center будет следовать за курсором мыши, то естественно, чтобы рисование инициировалось обработчиком события MouseMove нашей формы BezierWeb . (Напомню, для подключения события формы или элемента управления достаточно в режиме проектирования выбрать нужный элемент, в окне свойств этого элемента щелкнуть по значку с изображением молнии и из списка возможных событий данного элемента выбрать нужное, что приведет к созданию заготовки обработчика событий .)
Вот текст обработчика этого события:
private void BezierWeb_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) < pen = SystemPens.Control; DrawWeb(); center.X = e.X; center.Y = e.Y; //pen = new Pen(Color.Aquamarine); pen = SystemPens.ControlText; DrawWeb(); >
Метод DrawWeb вызывается дважды — первый раз с пером цвета фона, другой — с цветом, принятым системой для отображения текста. Обратите внимание, для создания нужного пера в данном случае не вызывается конструктор класса , а используется класс предопределенных системных перьев. Оператор, создающий объект pen с помощью конструктора , закомментирован. Он может использоваться, если нужно рисовать кривые определенным цветом.
Перед рисованием кривых цветом переднего плана общая для всех кривых точка center получает координаты курсора мыши, передаваемые аргументом обработчика события .
