Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_1-2.docx
Скачиваний:
3
Добавлен:
06.11.2018
Размер:
757.66 Кб
Скачать

Лабораторна робота №1-2 Тема: Робота з графікою. Створення графічних примітивів

Теоретичні відомості

Тепер ви дізнаєтеся, як за допомогою функцій Gdi+ з простору імен System.Drawing, що є новим API (application programming interface – інтерфейсом прикладного програмування) для створення графіки, у ваших формах створювати унікальні зображення. Створювані вами зображення можуть додати у ваші форми колір, геометричні фігури і текстури, при цьому використовувати їх дуже легко.

Використання координатної системи форми

Перше, що потрібно вивчити при роботі з графікою – це координатну систему форми. У Visual Basic кожна форма має свою систему координат. Початкова точка системи координат знаходиться у верхньому лівому кутку форми. Система координат за замовчуванням складається з рядків і стовпців апаратно-незалежних графічних елементів – пікселів. Вони є найменшими крапками, які ви можете використовувати у формі Visual Basic.

У системі координат Visual Basic рядки пікселів розташовані уздовж осі Х (горизонтальна вісь), а стовпці пікселів розташовуються уздовж осі У (вертикальна вісь). Ви можете визначити положення в системі координат, вказавши перетин рядка і стовпця за допомогою запису (x, у). Координати (x, у) верхнього лівого кута форми завжди рівні (0, 0). На наступній ілюстрації показано, як описується в системі координат Visual Basic розташування у формі об'єкту області виведення зображень.

Visual Basic взаємодіє з драйвером відеокарти вашого комп'ютера і з його допомогою визначає, як у формі відображаються пікселі і різні фігури (лінії, прямокутники, криві і кола). Для відображення конкретних фігур, таких, як лінія, показана на наступній ілюстрації, використовується багато пікселів. Логіка, яка використовується для відображення цього типу графіки, – не ваша турбота, вона виконується графічним адаптером і процедурами малювання з графічної бібліотеки Gdi+. На наступній ілюстрації показано збільшене зображення спотворень або ламаних країв, які ви іноді можете бачити в додатках Visual Basic і Windows.

Клас System.Drawing.Graphics, його методи

На чому ми можемо малювати в VB? На формі, на текстовому полі, на графічному полі PictureBox, на інших елементах управління. Але в коді класів форми і елементів управління немає програм малювання. Ви можете переконатися в цьому, поставивши після слова Button1 і переглянувши список, що відкривається. Ви не знайдете там нічого, що дозволяє малювати. Для забезпечення малювання в VB є спеціальний клас Graphics, розташований в просторі імен System.Drawing. Його код і містить програми для малювання фігур та для іншої роботи з графічною інформацією.

Зайдіть в Object Browser (View  Other Windows  Object Browser) та знайдіть клас Graphics. Клацніть на ньому – в правій панелі ви побачите властивості та методи цього класу. Серед них багато методів малювання фігур – хоча б всі ті, що починаються на Draw. Але, якщо ви у вікні коду на пишете слово Graphics та поставите точку, то в у відкритому списку ви цих методів не побачите. Отже, так просто їх застосовувати не можна.

Всі можливості класу малювання Graphics нам стануть доступні лише тоді, коли ми з цього класу створимо об’єкт.

Існує ще така вимога: формі і кожному елементу управління – свій елемент класу Graphics. Це означає, що якщо ми збираємося малювати на формі, двох кнопках і на мітці, то нам доведеться створювати 4 об’єкта класу Graphics.

Простір імен System.Drawing включає численні класи для створення графіки. У цьому розділі ви дізнаєтеся про клас System.Drawing.Graphics, який надає методи і властивості для малювання геометричних фігур.

Незалежно від того, чи створюєте ви просту фігуру або складне креслення, важливо мати можливість малювати у ваших програмах велику частину стандартних геометричних фігур. Наступна таблиця містить перелік базових фігур і методів класу System.Drawing.Graphics.

Метод

Опис

DrawArc

Дуга, створена на базі еліпса.

DrawBezier

Крива Без’є.

DrawClosedCurve

Замкнута крива, створена на основі масиву точок.

DrawCurve

Крива, створена на основі масиву точок.

DrawEllipse

Еліпс.

DrawImage

Малюнок.

DrawLine

Відрізок.

DrawPath

Лінії і криві, створені на базі об'єкту класу GraphicsPath.

DrawPie

Сегмент.

DrawPolygon

Багатокутник.

DrawReсtangle

Прямокутник.

DrawString

Рядок тексту.

FillEllipse

Заповнений еліпс.

FillPath

Заповнений шлях.

FillPie

Заповнений сектор.

FillPolygon

Заповнений багатокутник.

FillReсtangle

Заповнений прямокутник.

FillRegion

Заповнена область.

Методи з префіксом «Draw» створюють порожні чи «незаповнені» фігури, а методи з префіксом «Fill» (заповнити) створюють фігури, що автоматично заповнені деяким кольором.

Подія Paint

Перш ніж намалювати який-небудь об'єкт, наприклад чотирикутник, необхідно створити контекст графічного пристрою, використовуючи клас Graphics. Як правило, доступ до контексту графічного пристрою проводиться через подію Paint форми. Після отримання доступу до екземпляру класу Graphics можна скористатися будь-яким з його методів для створення графічного зображення.

Створимо процедуру обробки події Paint. Відкриємо вікно редактора коду і у випадному списку Class Name (Имя класса) виберемо рядок (Form Events), а у випадному списку Method Name (Имя метода) – рядок Paint. При цьому буде створена процедура обробки події Form1_Paint. Тепер за допомогою даної процедури, використовуючи методи класу Graphics, можна створювати відповідні цим методам графічні зображення.

В наступному прикладі ми створимо зображення чотирикутника двома способами:

Private Sub Form1_Paint(ByVal sender As Object, ByVal e _

As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

'спосіб перший

e.Graphics.DrawRectangle(New Pen(Color.Red, 3), 100, 100, 100, 100)

'другий спосіб

Dim gr As Graphics = e.Graphics

gr.DrawRectangle(New Pen(Color.Black, 3), 250, 100, 100, 100)

End Sub

Зверніть увагу на використання параметру е. Цей параметр можна розглядати як змінну, значення якої – результат користувацької події, наприклад доступ до класу Graphics, на базі якого створюється конкретне зображення.

Подію Paint можна застосовувати для створення графіки не тільки на формі, але й на елементі управління. Для цього розмістіть на формі потрібний елемент управління, наприклад кнопку Button, виберіть рядок з назвою цього елементу у випадному списку Class Name, а потім у випадному списку Method Name виберіть рядок Paint. Внаслідок буде створена подія Button_Paint. При цьому слід пам’ятати, що точкою відліку координат є лівий верхній кут елемента управління. Ось як виглядає код, що малює на кнопці прямокутник:

Private Sub Button1_Paint(ByVal sender As Object, _

ByVal e As System.Windows.Forms.PaintEventArgs) _

Handles Button1.Paint

e.Graphics.DrawRectangle(New Pen(Color.Red, 3), 10, 10, 40, 30)

End Sub

Нарешті, отримати доступ до методів класу Graphics можна без використання події Paint. Наступний код малює прямокутник на формі внаслідок натиснення на кнопку Button:

Private Sub Button1_Click(ByVal sender As Object, _

ByVal e As System.EventArgs) Handles Button1.Click

Dim gr As Graphics = Me.CreateGraphics

gr.DrawRectangle(New Pen(Color.Green, 3), 10, 10, 150, 150)

End Sub

Конструктори і методи

Конструктор – це процедура (підпрограма), що містить параметри у вигляді початкових даних, необхідних для виконання об’єктом запрограмованих дій. Початкові дані визначаються розробником. Параметри конструктора вказуються в дужках одразу за іменем класу. Наприклад: (New Pen(Color.Green)). Обов’язковим параметром є наявність оператора New. Конструктор не повертає ніякого значення. Таким чином головне призначення конструктора – визначення початкових даних об’єкта, що створюється. До того ж таких конструкторів може бути декілька. Ось два приклади запису одного і того ж конструктору структури Rectangle, який містить дані, що визначають параметри прямокутника:

'спосіб перший

Dim rct1 As New Rectangle(110, 110, 200, 200)

'другий спосіб

Dim rct2 As Rectangle

rct2=New Rectangle (110, 110, 200, 200)

Після того як буде поставлена дужка, з’явиться спливаюча підказка з необхідними параметрами. В даному випадку це горизонтальна координата лівої верхньої вершини прямокутника, її вертикальна координата, висота об’єкта і його ширина. Зверніть увагу, що цей конструктор – не єдиний. В тій самій підказці вказаний ще один конструктор, в якому такі ж параметри задаються другим способом. Отже, спочатку створюємо конструктор з параметрами – координатами лівої верхньої вершини прямокутника, потім конструктор, що визначає його висоту і ширину:

'координати точки

Dim pt As Point

pt = New Point(100,100)

'висота і ширина

Dim sz As New Size(150,150)

'прямокутник

Dim rct2 As Rectangle

rct2=New Rectangle (pt, sz)

Таким чином, першою оголошується змінна, потім вказується оператор New, ім’я класу і структури і, нарешті, в дужках додаються параметри об’єкта. Але, написавши цей код, ми не отримаємо зображення прямокутника, оскільки як вже вказувалося, конструктор значень не повертає. Для цього використовується метод, що створює потрібний об'єкт. В даному випадку – метод DrawRectangle. Метод відрізняється від конструктора тим, що повертає задане значення – малює вказану фігуру. При визначенні параметрів методу також є можливість скористатися підказкою. Обов'язковим параметром всіх методів є так зване перо (Pen). Цей параметр визначає товщину і колір ліній з яких складається намальований об'єкт. При суцільному забарвленні геометричної фігури замість пера використовується кисть (Brush). У наведеному нижче коді параметрами методу DrawRectangle є перо, вертикальна і горизонтальна координати, висота і ширина прямокутника.

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

e.Graphics.DrawRectangle(New Pen(Color.Black, 3), 110, 110, 200, 200)

End Sub

Заповнення фігур по кольору і по вказаному зразку

Для заповнення специфікованої області за допомогою одного з методів Fill використовується відповідний стиль. Стиль може бути монохромний або градієнтним. Наприклад, перший оператор будує прямокутник зеленим кольором, другий – визначає прямокутник для побудови стилю, третій – комбінує двома кольорами, здійснюючи перехід від одного кольору до іншого під кутом 30 градусів, а четвертий будує еліпс цим стилем заповнення.

Dim g As Graphics = e.Graphics

g.FillRectangle(Brushes.Green, 0, 35, 120, 50)

Dim pR1 As New Rectangle(5, 5, 100, 50)

Dim dpfill As New System.Drawing.Drawing2D.LinearGradientBrush(pR1, _

Color.Aqua, Color.Gold, 30)

g.FillEllipse(dpfill, 130, 25, 100, 50)

Побудова багатокутника і замкнутої кривої, створеної на основі масиву точок

Для побудови багатокутника використовують масив точок, що є координатами відповідних вершин. спочатку потрібно оголосити розмірність масиву, а після цього присвоїти значення відповідним змінним. Наприклад:

Dim apt3(3) As Point

apt3(0).X = 100 : apt3(0).Y = 20

apt3(1).X = 280 : apt3(1).Y = 70

apt3(2).X = 120 : apt3(2).Y = 170

apt3(3).X = 20 : apt3(3).Y = 110

Після цього можна побудувати багатокутник або заповнену області. Наприклад:

Dim pR1 As New Rectangle(5, 5, 175, 200)

Dim dpfill As New System.Drawing.Drawing2D.LinearGradientBrush(pR1, _

Color.Aqua, Color.Gold, 40)

e.Graphics.FillPolygon(dpfill, apt3)

Аналогічно будуються замкнені плавні криві, що проходять через ці точки.

Базові об'єкти класу Graphics

Після створення екземпляру класу Graphics його можна використовувати, малюючи лінії, криві, відображаючи текст і т.д. При цьому треба застосовувати базові об'єкти класу Graphics, що задають стиль створюваних геометричних фігур (див. табл.).

Об'єкт

Опис

Brush

Описує стиль заповнення фігур по вказаному зразку і кольору

Pen

Описує стиль і ширину відображення ліній, дуг, еліпсів, прямокутників, багатокутників і секторів

Font

Шрифт і його стиль

Color

Колір

Клас Pen

Клас Pen (перо) використовується для завдання стилю і ширини ліній, дуг, еліпсів, прямокутників, багатокутників і секторів.

Наприклад, в наступному коді малюються дві лінії. Одна — синього кольору, а інша — червоного, причому її товщина рівна 10.

Малювння лінії двома різними перами

Public Class Form1

Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim g As Graphics = e.Graphics

Dim pnl As New Pen(Color.Blue)

g.DrawLine(pnl, 10, 10, 100, 100)

Dim pn2 As New Pen(Color.Red, 10)

g.DrawLine(pn2, 100, 10, 10, 100)

End Sub

End Class

Клас Color

Клас color простору імен System.Drawing визначає засоби для установки кольорів, що надають ARGB-модель кольору, де А — альфа-складова кольору, а R, G, В — червона, зелена і блакитна її складові відповідно.

У класі color є властивості A, R, G, В, що повертають однойменні складові колірної моделі.

Поле Empty класу Color повертає порожній колір. Перераховані нижче властивості встановлюють відповідні системні кольори. Імена цих властивостей є також елементами перерахування KnownColor, яке об'єднує системні кольори в єдиний набір.

AliceBlue

AntiqueWhite

Aqua

Aquamarine

Azure

Beige

Bisque

Black

BlanchedAlmond

Blue

BlueViolet

Brown

BurlyWood

CadetBlue

Chartreuse

Chocolate

Coral

CornflowerBlue

Cornsilk

Crimson

Cyan

DarkBlue

DarkCyan

DarkGoldenrod

DarkGray

DarkGreen

DarkKhaki

DarkMagenta

DarkOliveGreen

DarkOrange

DarkOrchid

DarkRed

DarkSalmon

DarkSeaGreen

DarkSlateBlue

DarkSlateGray

DarkTurquoise

DarkViolet

DeepPint

DeepSkyBlue

DimGray

DodgerBlue

Firebrick

FloralWhite

ForestGreen

Fuchsia

Gainsboro

GhostWhite

Gold

Goldenrod

Gray

Green

GreenYellow

Honeydew

HotPink

IndianRed

Indigo

Ivory

Khaki

Lavender

Lavende rBlush

LawnGreen

LemonChiffon

LightBlue

LightCoral

LightCyan

LightGoldenrodYellow

LightGray

LightGreen

LightPink

LightSalmon

LightSeaGreen

LightSkyBlue

LightSlateGray

LightSteelBlue

LightYellow

Lime

LimeGreen

Linen

Magenta

Maroon

MediumAquamarine

MediumBlue

MediumOrchid

MediumPurple

MediumseaGreen

MediumSlateBlue

MediumSpringGreen

MediumTurquoise

MediumVioletRed

MidnightBlue

MintCream

MistyRose

Moccasin

Navaj oWhite

Navy

OldLace

Olive

OliveDrab

Orange

OrangeRed

Orchid

PaleGoldenrod

PaleGreen

PaleTurquoise

PaleVioletRed

PapayaWhip

PeachPuff

Peru

Pink

Plum

PowderBlue

Purple

Red

RosyBrown

RoyalBlue

SaddleBrown

Salmon

SandyBrown

SeaGreen

SeaShell

Sienna

Silver

SkyBlue

SlateBlue

SlateGray

Snow

SpringGreen

SteelBlue

Tan

Teal

Thistle

Tomato

Transparent

Turquoise

Violet

Wheat

White

WhiteSmoke

Yellow

YellowGreen

Клас Font

Клас Font простору імен System.Drawing створює шрифт, специфікуючи тип, розмір і стиль.

Як ілюстрацію можна привести приклад виведення тексту за допомогою методу Drawstring. Шрифт тексту, що відображається, задається як екземпляр класу Font. Крім того, необхідно вказати, за допомогою якої "кисті" малюється текст, тобто створити екземпляр одного з похідних від абстрактного класу Brush, в даному випадку, класу SolidBrush.

Приклад виводу тексту

Public Class Form1

Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim g As Graphics = e.Graphics

Dim fnt As New Font("Times New Roman", 20, FontStyle.Bold)

Dim sb As New SolidBrush(Color.Red)

g.DrawString("Привіт!!!!!", fnt, sb, 10, 50)

End Sub

End Class

Клас Brush

Клас Brush є абстрактним, тобто неможливо створити екземпляр цього класу. На базі класу Brush створюються екземпляри класів: SolidBrush, TextureBrush, HatchBrush, LinearGradientBrush і PathGradientBrush.

Після створення відповідної кисті, вона, як правило, використовується для заповнення специфікованої області за допомогою одного з методів Fill.

  • Клас SoildBrush визначає кисть, що малює лінії суцільним однорідним кольором. Ця кисть зазвичай використовується при заливці однорідним кольором фігур, подібних до прямокутника, еліпса, багатокутника, сектора і шляху. Приклад: e.Graphics.FillRectangle(New SolidBrush(Color.Red), 10, 10, 100, 100)

  • Клас TextureBrush створює кисть, яка заповнює область на основі текстури, тобто заданого зображення. В коді необхідно вказати адресу, за якою розташоване дане зображення.

Dim Im As New Bitmap("c:\anim.gif")

e.Graphics.FillRectangle(New TextureBrush(Im), 20, 20, 250, 250)

  • Клас HatchBrush створює кисть, яка заповнює область на основі специфікованого штрихування. Причому ця ж кисть дозволяє вибрати вигляд і колір штрихування, а також колір фону. Параметр HatchStyle встановлює вид штрихування, параметр Forecolor визначає його колір, а параметр Backcolor – колір фону. Властивості параметра Hatchstyle представлені в списку елементів перерахування, який розкривається після відкриття дужки.

Dim brush As New System.Drawing.Drawing2D.HatchBrush(Drawing2D.HatchStyle.ForwardDiagonal,_Color.Brown, Color.Gold)

e.Graphics.FillPie(brush, 50, 50, 150, 150, 0, 270)

  • Клас LinearGradientBrush створює кисть, яка заповнює фігури на основі градієнтного розподілу колірної гамми уздовж відрізка прямої лінії. Клас LinearGradientbrush дає можливість створювати градієнтну заливку трьома способами.

Розглянемо перший спосіб. Визначимо два кольори, що граничать між собою і відрізок прямої, уздовж якого здійснюватиметься перехід від одного кольору до іншого. В даному прикладі ми створимо градієнтну заливку прямокутника:

Dim rect As New Rectangle(10, 10, 150, 100)

Dim ptl As New Point(0, 50)

Dim pt2 As New Point(160, 50)

Dim brush As New System.Drawing.Drawing2D.LinearGradientBrush(ptl, _

pt2, Color.Black, Color.Gold)

e.Graphics.FillRectangle(brush, rect)

Другий спосіб полягає в тому, що спрямованість градієнтної заливки визначається параметрами прямокутника і елементами, перерахованими в списку Hatchstyle, який ви побачите, після відкриття дужки. У даному прикладі створимо заповнений сектор:

Dim rect1 As New Rectangle(10, 10, 150, 100)

Dim brushl As New System.Drawing.Drawing2D. _

LinearGradientBrush(rect1, Color.Black, Color.Gold, 3)

e.Graphics.FillPie(brushl, rect1, 0, 160)

Елементи, перераховані в списку, також мають свої номери. У цьому коді замість елементу BackWardDiagonal поставлена цифра 3.

Третій спосіб визначає напрям зміни кольору вздовж умовної лінії, напрям якої, у свою чергу задається величиною кута повороту за годинниковою стрілкою від осі абсцис.

Dim rect2 As New Rectangle(10, 10, 100, 100)

Dim brush2 As New System.Drawing.Drawing2D. _

LinearGradientBrush(rect2, Color.Gold, Color.Black, 180)

e.Graphics.FillEllipse(brush2, rect2)

  • Клас PathGradientBrush створює кисть, аналогічну класу LinearGradientBrush, але заповнення фігури ведеться не вздовж прямої, а вздовж довільної вказаної лінії.

В наступному коді створюється еліпс з товстою межею, заповнений градієнтною заливкою. Для того, щоб заливка не перекрила межу еліпса у пера, що створює межу, встановлено значення властивості Alignment рівним PenAlignment.Outset, що дозволяє малювати контур поза уявною лінією, уздовж якої проводиться пером. Градієнтна заливка створює поступовий перехід від червоного до жовтого кольору уздовж лінії, що йде від верхнього правого до нижнього лівого кута прямокутника, в який вписаний еліпс (мал. 12.4).

Відображення еліпса з товстою межею, заповненого градієнтною заливкою

Public Class Form1

Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

Dim g As Graphics = e.Graphics

Dim rect As New Rectangle(10, 10, 100, 200)

Dim pn As New Pen(Color.Blue, 10)

pn.Alignment = Drawing2D.PenAlignment.Outset

g.DrawEllipse(pn, rect)

Dim lgb As New Drawing2D.LinearGradientBrush(rect, Color.Red, Color.Yellow, Drawing2D.LinearGradientMode.BackwardDiagonal)

g.FillEllipse(lgb, rect)

End Sub

End Class

Геометричні структури

Лінія

Метод DrawLine класу Graphics дозволяє створювати лінії. У цьому методі є три параметри — перо, що її створює, а також дві точки, що сполучаються лінією.

e.Graphics.DrawLine(New Pen(Color.Red, 3), 10, 10, 100, 100)

Dim pen As Pen = New Pen(Color.Black, 3)

Dim ptl As New Point(30, 10)

Dim pt2 As New Point(120, 100)

e.Graphics.DrawLine(pen, ptl, pt2)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]