Какой класс задает кисть для закраски области предопределенным узором
Перейти к содержимому

Какой класс задает кисть для закраски области предопределенным узором

  • автор:

Общие сведения о кистях WPF

Все, что видно на экране, отображается, так как нарисовано с помощью кисти. Например, кисть используется для описания фона кнопки, переднего плана текста и заливки фигуры. В этом разделе приводятся основные понятия рисования с помощью кистей Windows Presentation Foundation (WPF) и приведены примеры. Кисти позволяют рисовать объекты пользовательского интерфейса с помощью простых, сплошных цветов до сложных наборов шаблонов и изображений.

Закрашивание с помощью кисти

Brush закрашивает область своими выходными данными. Разные кисти имеют разные типы выходных данных. Некоторые кисти заполняют область сплошным цветом, другие — градиентом, узором, изображением или рисунком. На следующем рисунке показаны примеры каждого из различных типов Brush.

Brush types

Примеры кистей

Большинство визуальных объектов позволяют указать, как именно они закрашиваются. В следующей таблице перечислены некоторые распространенные объекты и свойства, с которыми можно использовать 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. На следующем рисунке показан закрашенный прямоугольник.

A rectangle painted using a SolidColorBrush

Прямоугольник, закрашенный с помощью 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. На следующем рисунке показан закрашенный прямоугольник.

A rectangle painted using a LinearGradientBrush

Прямоугольник, закрашенный с помощью 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. На следующем рисунке показан закрашенный прямоугольник.

A rectangle painted using a RadialGradientBrush

Прямоугольник, закрашенный с использованием 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. На следующем рисунке показан закрашенный прямоугольник.

A Rectangle painted by an ImageBrush

Прямоугольник, закрашенный с использованием изображения

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. На следующем рисунке показан закрашенный прямоугольник.

A rectangle painted using a DrawingBrush

Прямоугольник, закрашенный с помощью 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. На следующем рисунке показан закрашенный прямоугольник.

A rectangle painted using a VisualBrush

Прямоугольник, закрашенный с использованием 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, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

18.1 Рисование в форме

Графика необходима при организации пользовательского интерфейса. Образы информативнее текста. Framework .Net реализует расширенный графический интерфейс GDI+, обладающий широким набором возможностей. Но для рисования в формах достаточно иметь три объекта — перо, кисть и, хочется сказать, бумагу, но третий нужный объект — это объект класса Graphics, методы которого позволяют в формах заниматься графикой — рисовать и раскрашивать.

Класс Graphics — это основной класс, необходимый для рисования. Класс Graphics, так же, как и другие рассматриваемые здесь классы для перьев и кистей, находятся в пространстве имен Drawing, хотя классы некоторых кистей вложены в подпространство Drawing2D.

Объекты этого класса зависят от контекста устройства, (графика не обязательно отображается на дисплее компьютера, она может выводиться на принтер, графопостроитель или другие устройства), поэтому создание объектов класса Graphics выполняется не традиционным способом — без вызова конструктора класса. Создаются объекты специальными методами разных классов. Например, метод CreateGraphics класса Control — наследника класса Form — возвращает объект, ассоциированный с выводом графики на форму.

При рисовании в формах можно объявить в форме поле, описывающее объект класса Graphics:

а в конструкторе формы произвести связывание с реальным объектом:

Затем всюду в программе, где нужно работать с графикой, используется глобальный для формы объект 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)

Методпособие ДРП — версия 3

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ» Н.М. Козьминых ПРОГРАММИРОВАНИЕ НА C# ДОПОЛНИТЕЛЬНЫЙ РАЗДЕЛ Часть 1 Допущено редакционно-издательской комиссией методического совета ГОУ ВПО «ВятГУ» в качестве учебно-методического пособия для проведения лабораторных работ для студентов направления подготовки 080500 «Бизнес информатика» и 230700 «Прикладная информатика», всех профилей подготовки всех форм обучения

Киров 2014

Рекомендовано к изданию методическим советом Факультета экономики и менеджмента ГОУ ВПО «ВятГУ» Допущено редакционно-издательской комиссией методического совета ГОУ ВПО «ВятГУ» в качестве учебно-методического пособия для проведения лабораторных работ для студентов направления подготовки 080500 «Бизнес информатика» и 230700 «Прикладная информатика», всех профилей подготовки всех форм обучения Рецензенты: Козьминых, Н.М. Программирование на С#. Дополнительный раздел: учебно-методического пособия для проведения лабораторных работ для студентов направления подготовки 080500 «Бизнес-информатика» , 230700 «Прикладная информатика» всех профилей подготовки, всех форм обучения / Н.М. Козьминых. – Киров: ПРИП ГОУ ВПО «ВятГУ», 2014.- 30 с. В издании излагаются методические рекомендации к выполнению лабораторных работ по дисциплинам «Программирование», «Дополнительные разделы программирования». УДК 004(07) К593 © ГОУ ВПО «ВятГУ», 2014

Перечень лабораторных работ. 4
Лабораторная работа №1. Построение графика функции. 5
1. Построение графика функции . 5
2. Основы рисования в Visual Studio. 5
3 Класс Graphics . 6
4 Класс Pen. 8
5 Класс Brush. 9
6 Задание цвета. 11
7 Диалог. Диалоговые окна. 12
8 Пример использования средств рисования. 14
9 Пример работы . 15
Лабораторная работа №2. Рисование фигуры . 18
1 Пример анимированной надписи . 18
2 Рисование фигур. 19
2.1 Линия и линии. 19
2.2 Прямоугольник. 20
2.3 Остальные фигуры . 21
3 Совместное рисование нескольких фигур. 23
4 Вывод текста в графическое окно . 25
5 Загрузка изображения из файла. 26
6 Загрузка звукового файла . 28
Лабораторная работа №3. Анимация . 30

Перечень лабораторных работ Перечень лабораторных работ

№ Л.р. Наименование работы Количество № недели Дата
п/п часов
I семестр
1 1 Построение графика функции 14 1 — 7 01.09-
19.10
2 Первая контрольная точка: аттестационная неделя
3 2 Рисование фигуры 6 8 — 10 20.10-
09.11
4 3 Анимация 14 11 — 17 10.11-
28.12
5 Вторая контрольная точка: аттестационная неделя
6 Защита работ 2 18
7 Третья контрольная точка: зачет
ИТОГО 36 18

Лабораторная работа №1. Построение графика функции Цель работы: создать приложение с графическим интерфейсом для построения графика функции. План работы: студент должен изучить материал текущей лабораторной работы и продемонстрировать свои навыки преподавателю. В результате чего студент получает оценку за приложение и за изученный материал. Задание: создать приложение построения графика функции ρ= a cos 2 b sin 2 a= 40 , 0 2π , = 0,05 ,для b :10 b 100 , заданного в полярных координатах. Требование к работе: 1. предусмотреть кнопки «Нарисовать» и «Выход»; 2. предусмотреть возможность изменения цвета графика функции и цвета фона; 3. предусмотреть возможность изменения толщины линии. Теоретический материал работы 1. Построение графика функции Существует четыре способа задания функции:в явной форме у = F(x) ; в неявной форме F(x,y) = 0 ;

параметрическая х = f 1 ( t), y = f 2 ( t) ;
в полярных координатах ρ= ρ (φ), φ (φ 1 , φ 2 ) . Полярные координаты

ρ и φ связаны с декартовой системой координат следующими соотношениями х = ρCosφ, y = ρSinφ . Если функция задана явно у = F(x) , то для построения можно воспользоваться циклом, в котором осуществляется вычисление значения функции для значений х , меняющихся с заданным шагом, и нанесение этих точек на график. В этом случае графическая зависимость будет представлять собой последовательность точек. 2. Основырисования в Visual Studio Для рисования объектов в Windows Forms приложениях язык С++ содержит очень богатый набор методов. Пространство имен Drawing содержит множество объектов, которые облегчают программисту работу с графикой. Специально для .NET платформы разработчики Microsoft разработали GDI+ библиотеку, значительно повысив возможности GDI (Graphic Device Interface). GDI+ включает возможности рисования простейших объектов (линии, эллипсы. ), рисование различных объектов 2D графики, отображение файлов различных графических форматов (bmp, jpeg, gif, wmf, ico, tiff, . ) и многое другое. .Net позволяет рисовать линии, прямоугольники и другие фигуры в координатной системе. Кроме того, можно выбирать различные координатные системы, но по умолчанию начало координат находится в верхнем левом углу, где ось Х направлена вправо, а ось У вниз. Единицей измерения является пиксель (pixel) (рис.1.1).

Рисунок 1.1 — Область рисования 3 Класс 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 большое число методов и свойств. Группа статических методов класса позволяет создать объект этого класса, задавая, например, описатель (handle) контекста устройства. Для рисования наиболее важны три группы методов (таблица 1.1). К первой относится перегруженный метод DrawString, позволяющий выводить тексты в

графическом режиме. Вторую группу составляют методы Draw — DrawEllipse, DrawLine, DrawArc и другие, позволяющие цветным пером (объектом класса Pen ) рисовать геометрические фигуры: линии, различные кривые, прямоугольники, многоугольники, эллипсы и прочее. К третьей группе относятся методы Fill — FillEllipse, FillPie, FillRectangle и другие, позволяющие нарисовать и закрасить фигуру кистью. Кисти (объекты классов, производных от Brush ), могут быть разные — сплошные, узорные, градиентные. Таблица 1.1 — Методы класса Graphics

DrawArc Рисует дугу, которая является частью эллипса, заданного парой координат,
шириной и высотой.
DrawBezier Рисует сплайны Безье, которые заданы точками структуры Point.
DrawBeziers Рисует сплайны Безье, которые соединяют массив структур Point.
DrawClosedCurve Рисует замкнутые кардинальные сплайны, точки которых определены как
массив структур Point.
DrawCurve Рисует кардинальные сплайны (это кривая, которая плавно проходит через
набор точек), точки которых определены как массив структур Point.
DrawEllipse Формирует эллипс, определенный ограничивающим прямоугольником,
заданным с помощью пары координат, ширины и высоты.
DrawImage Рисует заданный объект Image в заданном месте, используя исходный размер.
DrawLine Проводит линию, соединяющую две точки, определенные парами координат.
DrawLines Формирует набор сегментов линии, которые соединяют массив структур
Point.
DrawPie Рисует сектор, определенный эллипсом, который задан парой координат,
шириной, высотой и двумя радиальными линиями.
DrawPolygon Рисует многоугольник, определяемый массивом структур Point.
DrawRectangle Рисует прямоугольник, который определен парой координат, шириной и
высотой.
DrawRectangles Рисует набор прямоугольников, определяемых структурой Rectangle .
DrawString Создает текстовую строку в заданном месте с указанными объектами Brush и
Font .
FillClosedCurve Закрашивает замкнутые кардинальные сплайны, точки которых определены
как массив структур Point.
FillEllipse Закрашивает эллипс, определенный ограничивающим прямоугольником,
заданным с помощью пары координат, ширины и высоты.
FillPie Закрашивает сектор, определенный эллипсом, который задан парой
координат, шириной, высотой и двумя радиальными линиями
FillPolygon Закрашивает многоугольник, определяемый массивом структур Point.
FillRectangle Закрашивает прямоугольник, который определен парой координат, шириной
и высотой.
FillRectangles Закрашивает набор прямоугольников, определяемых структурой Rectangle .

4 Класс Pen Перо (Pen) – это один из инструментов рисования в окне приложения. Методам группы Draw класса Graphics, рисующим контур фигуры, нужно передать перо — объект класса Pen. В конструкторе этого класса можно задать цвет пера и его толщину (чаще говорят «ширину пера»). Цвет задается объектом класса (структурой) Color. Для выбора подходящего цвета можно использовать диалоговое окно Color либо одно из многочисленных статических свойств класса Color, возвращающее требуемый цвет. Возможно и непосредственное задание элементов структуры в виде комбинации RGB — трех цветов — красного, зеленого и голубого. Вместо создания нового пера с помощью конструктора можно использовать специальный класс предопределенных системных перьев. Например, создание пера зеленого цвета и толщиной 3 (рис.1.2 А): Pen penGreen = new Pen ( Color .Green, 3); Класс перо, также имеет свойство стиль (System.Drawing.Drawing2D.DashStyle) (таблица 1.2, рис.1.2 Б, В). Таблица 1.2 – Стили пера

DashStyle.Dash Прерывистая линия
DashStyle.DashDot Линия – точка
DashStyle.DashDotDot Линия – точка – точка
DashStyle.DashDot Линия точками
DashStyle.Solid Сплошная линия

Например, перу присваивается стиль штрих-пунктир: penGreen.DashStyle = System.Drawing.Drawing2D. DashStyle .DashDot; Создание специальных наконечников (рис.1.2 Г): Pen p = new Pen(Color.Aqua, i); // начало линии – наконечник в виде ромба, конец линии — круг p.StartCap = LineCap.DiamondAnchor; p.EndCap = LineCap.RoundAnchor;

Рисунок 1.2 — Использование пера ( А – разная толщина пера, Б – разная толщина в стиле «пунктир», В – разная толщина пера в стиле «штрих-пунктир», Г – разные «наконечники»). Можно воспользоваться «системными перьями», которые определены в перечислении Pens. Название перьев в перечислении определяются названием цвета пера, например, Pens.Red. 5 Класс Brush Кисть (Brush) – это еще один инструмент рисования, с помощью которого происходит заливка (закраска) фигур. Как и для перьев, существует перечисление «системных кистей» Brushes, название кисти в котором определяется названием цвета. Так определяются «сплошные» кисти, т.е. кисти, производящие закраску сплошным цветом. Класс Brush является абстрактным классом, так что создавать кисти этого класса нельзя, но можно создавать кисти классов-потомков Brush. Таких классов пять — они задают кисть: SolidBrush — для сплошной закраски области заданным цветом; TextureBrush — для закраски области заданной картинкой (image); HatchBrush — для закраски области предопределенным узором; LinearGradientBrush — для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается линейным градиентом; PathGradientBrush — для сплошной закраски с переходом от одного цвета к другому, где изменение оттенков задается более сложным путем. Первые два класса кистей находятся в пространстве имен System.Drawing, остальные — в System.Drawing.Drawing2D. SolidBrush sb = new SolidBrush ( Color .Red); Сплошную кисть можно создать с помощью класса SolidBrush. При создании требуется задать только цвет (рис. 1.3). SolidBrush sb2 = Brushes.OrangeRed;

Рис 1.3 — Использование стандартной кисти Brushes.OrangeRed. Предопределенный рисунок. Например, задать кисть, которая на желтом фоне красным цветом рисует узор «решетка» (рис. 1.4): HatchBrush br = new HatchBrush(HatchStyle.Cross,Color.Red,Color.Yellow); Рис 1.4 — Использование кисти-узора. Градиентные кисти (класс LinearGradientBrush) задают «перелив» из одного цвета в другой (рис. 1.5). При создании такой кисти задается прямоугольник, который в памяти заполняется указанными цветами. Кроме двух цветов, указывается направление «перелива» (значение из перечисленияLinearGradientMode). Например, в следующем примере создается кисть с «переливом» от желтого цвета к синему по главной диагонали. Rectangle r = new Rectangle(0,0,300,300); LinearGradientBrush br = new LinearGradientBrush(r, Color.Yellow, Color.Blue,LinearGradientMode.ForwardDiagonal);

Рисование в форме

Графика необходима при организации пользовательского интерфейса. Образы информативнее текста. Framework .Net реализует расширенный графический интерфейс GDI+, обладающий широким набором возможностей. Но для рисования в формах достаточно иметь три объекта — перо, кисть и, хочется сказать, бумагу, но третий нужный объект — это объект класса Graphics, методы которого позволяют в формах заниматься графикой — рисовать и раскрашивать.

Класс Graphics

Класс Graphics — это основной класс, необходимый для рисования. Класс Graphics, так же, как и другие классы для перьев и кистей, находятся в пространстве имен Drawing, хотя классы некоторых кистей вложены в подпространство Drawing2D.

Объекты этого класса зависят от контекста устройства, (графика не обязательно отображается на дисплее компьютера, она может выводиться на принтер), поэтому создание объектов класса Graphics выполняется не традиционным способом — без вызова конструктора класса. Создаются объекты специальными методами разных классов. Например, метод CreateGraphics класса Control — наследника класса Form — возвращает объект, ассоциированный с выводом графики на форму.

При рисовании в формах можно объявить в форме поле, описывающее объект класса Graphics:

а в конструкторе формы произвести связывание с реальным объектом:

Методы класса Graphics

У класса 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.

У каждого из этих классов свои конструкторы. В примере, обсуждаемом далее, рассмотрим создание кистей трех разных классов, там и поговорим о конструкторах классов.

Говоря о рисовании, нельзя не упомянуть о событии Paint. Оно возникает всякий раз, когда область, в которой происходило рисование, повреждена. Причины этого могут быть разные — пользователь свернул форму, изменил ее размеры, произошло перекрытие другой формой, был вызван метод Invalidate — во всех этих случаях требуется перерисовать область. Тогда-то и возникает событие Paint, в задачу его обработчика входит перерисовка поврежденной области.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *