Практическая работа по теме 6. Организация и средства человеко-машинного интерфейса

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
1
Практическая работа по теме 6. Организация и средства
человеко-машинного интерфейса
Классы GDI+ для графического вывода текста и изображений.
Обработчик события Paint. Использование альтернативных единиц
измерения в GDI+. Вывод изображений с помощью класса Image.
Свойства и методы класса Image.
Практическая работа по теме 6. Организация и средства человеко-машинного интерфейса
.........................................................................................................................................................1
Задание 1. Рисование при помощи классов GDI+ ..................................................................1
Задание 2. Обработчик события Paint ...................................................................................10
Задание 3. Использование альтернативных единиц измерения в GDI+ ............................11
Задание 4. Вывод изображений с помощью класса Image ..................................................12
Задание 5. Свойства и методы класса Image .........................................................................14
Задание 6. Миниатюры ...........................................................................................................16
Задание 7. Вывод текста .........................................................................................................18
Задание 8. Повернутая надпись..............................................................................................20
В предыдущих практических работах мы научились создавать
интерфейс приложения с помощью стандартных элементов
управления и типов из пространства имен System.Windows.Forms.
Теперь наша задача – научиться работать с выводом на форму
графики (изображения и текста). Мы должны будем познакомиться с
пространствами имен System.Drawing, System.Drawing.Drawing2D,
System.Drawing.Imaging, System.Drawing.Printing, System.Drawing.Text.
Задание 1. Рисование при помощи классов GDI+
Задача
Рисовать произвольные фигуры непосредственно на форме или
любом элементе управления, поддерживающем графический вывод.
Решение
Использование библиотеки стандартных классов GDI+ для
графического вывода готовых растровых изображений, текста и
различных геометрических фигур (векторной графики).
Обсуждение
Аббревиатура GDI означает Graphics Design Interface (интерфейс
для
создания
графики).
Так
называется
набор
классов,
предназначенных для вывода текста и изображений. Концепция GDI—
графическое ядро Windows, существующее уже много лет, его
последняя версия называется GDI+. С ее помощью создаются
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
2
графические изображения во всех языках программирования
платформы .NET.
Классы GDI+ располагаются в нескольких пространствах имен и для
их использования в проекте необходимо выполнить импорт требуемых
пространств, например, System.Drawing, System.Drawing.Drawing2D,
System.Drawing.Imaging, System.Drawing.Text и так далее. Так,
например, для создания градиентных заливок следует импортировать
в проект класс: Imports System.Drawing.Drawing2D.
Рассмотрим технологию создания векторной графики.
1. Создать объект типа System.Drawing.Graphics для той поверхности,
на которой вы хотите выполнять графический вывод изображения
или текста;
2. Создать перья, кисти, шрифты и другие объекты, используемые
командами вывода графики;
3. Воспользоваться графическими методами созданного объекта типа
Graphics для вывода на выбранные поверхности изображения или
текста;
4. После завершения вывода освободить все задействованные
объекты методом Dispose.
Создание графического объекта и связь его с контекстом элемента, на
котором графический вывод будет осуществлен, выполняется
следующим образом:
Dim g As Graphics – это создание объекта типа Graphics
g = PictureBox1.CreateGraphics – это связь объекта g и контекста
элемента PictureBox, на котором будет выполняться графический
вывод фигур или текстов;
или Dim g As Graphics = Me.CreateGraphics – если вывод будет
производиться непосредственно на форме.
Существует альтернативный способ создания контекста графического
объекта. Этот способ связан с написанием обработчика события Paint
элемента, на котором выполняется вывод графики.
В списке аргументов процедуры обработки события Paint всегда
присутствует параметр e типа PaintEventArgs, который ссылается на
объект Graphics, осуществляющий рисование на текущей поверхности
элемента управления или формы. Использование этого параметра
для создания контекста графического устройства выполняется
следующим образом:
Private Sub Form4_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
или
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
3
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Dim g As Graphics = e.Graphics
После того, как создан экземпляр класса Graphics, связанный
контекстом с конкретным элементом управления, на котором будет
выполняться графический вывод, необходимо создать экземпляры
стандартных классов System.Drawing.Brush, System.Drawing.Colors,
System.Drawing.Design, System.Drawing.Drawing2D, представляющих
собой стандартный инструментарий: перья, шрифты, цвет и так далее
(табл.1). Экземпляры созданных инструментов используются
методами графического объекта для вывода изображения или текста.
О том, какие конкретные инструменты будут необходимы при
выполнении конкретного графического метода, вам будет подсказано
в описании входных параметров каждого конкретного метода.
Рассмотрим
назначение
некоторых
стандартных
классов,
обеспечивающих инструментарий для выполнения графического
вывода.
Табл.1.
Стандартные классы инструментария
Класс Назначение
Brush Абстрактный класс – кисть, создавать объекты этого класса
мы не можем. Вместо этого, в нашем распоряжении
производные от Brush классы SolidBrush, HatchBrush,
LinearGradientBrush и так далее. Все эти классы описывают
стиль заполнения фигур по указанному образцу и цвету в
соответствии со своими функциональными возможностями.
Pen
Перо. Описывает стиль и ширину отображения линий, дуг,
эллипсов, прямоугольников, многоугольников и секторов
Font
Шрифт и его стиль, начертание
Color Цвет
Основной класс Graphics, который, собственно и выполняет
графический вывод, содержит следующие методы для создания
графических объектов (табл.2). Для выполнения методов из табл. 2
будут необходимы инструменты из табл.1.
Табл.2.
Методы класса Graphics
Метод
DrawArc
DrawBezier
DrawBeziers
DrawCloseCurve
DrawCurve
Описание
Дуга, созданная на базе эллипса
Кривая Безье
Последовательность кривых Безье
Замкнутая кривая, созданная на основе массива
точек
Кривая, созданная на основе массива точек
4
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
DrawEllipse
DrawImage
DrawLine
DrawPie
DrawPolygon
DrawRectangle
DrawString
FillEllipse
FillPath
FillPie
FillPolygon
FillRectangle
FillRectangles
FillRegion
Эллипс
Рисунок (вывод готового растрового изображения)
Отрезок
Сегмент
Многоугольник
Прямоугольник
Строка текста (графический вывод текста)
Заполненный эллипс
Закрашивает область внутри траектории
Заполненный сектор
Заполненный многоугольник
Заполненный прямоугольник
Заполненная последовательность прямоугольников
Заполненная область
Рассмотрим технологию программирования графического вывода:
− Создайте новый Windows-проект «Фигуры» или добавьте форму в
ваш текущий проект.
− Поместите на форму две командные кнопки и элемент управления
PictureBox1. Щелчок по первой кнопке будет рисовать в форме или
элементе PictureBox1 прямоугольник, по второй – треугольник.
Назовите кнопки соответственно выполняемым функциям.
− Создайте объект класса Graphics и инициализируйте его методом
CreateGraphics элемента управления PictureBox1 (тем самым вы
создаете контекст устройства вывода для этого объекта):
Dim G As Graphics
G= PictureBox1.CreateGraphics
Если хотите рисовать в форме, создайте объект Graphics с помощью
метода CreateGraphics этой формы:
Dim G As Graphics
G= Me. CreateGraphics
В соответствующих процедурах-обработчиках
создайте необходимые инструменты, например:
командных
кнопок
Dim p as Pen=New Pen(Color.red)
Dim p1, p2, p3 As Point
Вызывая методы графического объекта G класса Graphics
DrawRectangle и DrawLine, создайте изображение геометрических
фигур прямоугольник и треугольник с помощью инструментов Pen и
Point. Объект класса Pen будет использоваться для указания цвета
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
5
контура и толщины линии контура фигур. Объект класса Point будет
фиксировать координаты точек для построения фигуры треугольника.
Не забудьте освободить созданные графические объекты методами
Dispose().
Итак, рисуем прямоугольник:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
Dim G As Graphics, p As Pen = New Pen(Color.Azure)
G = PictureBox1.CreateGraphics
G.DrawRectangle(p, 10, 10, 100, 100)
p.Dispose()
G.Dispose()
End Sub
Нарисуем фигуру треугольника:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim G As Graphics
Dim P1, P2, P3 As Point
Dim redPen As Pen = New Pen(Color.Red, 4)
G = PictureBox1.CreateGraphics
’задание координат X и Y точек для построения треугольника
P1.X = 50
P1.Y = 70
P2.Y = 10
P2.X = 100
P3.Y = 10
P3.X = 40
‘рисуем стороны треугольника по заданным координатам
G.DrawLine(redPen, P1, p2)
G.DrawLine(redPen, P2, p3)
G.DrawLine(redPen, P3, p1)
‘освобождаем графические объекты
G.Dispose()
redPen.Dispose()
End Sub
Добавим в проект командные кнопки для рисования других
геометрических фигур, как, например, на рис. 1.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
6
Рис. 1. Варианты использования инструментария
Рассмотрим рисование замкнутых фигур с заполнение фоном.
Добавьте в проект кнопку для заполнения цветом некоторой области
(рис. 1). Заполнение выполняется кистью (объект класса Brush). При
создании объектов класса Brush вам удобнее импортировать в проект
пространство имен: Imports System.Drawing.Brushes.
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button3.Click
Dim g As Graphics
Dim reg As New Region
Dim b As Brush = New SolidBrush(Color.AliceBlue)‘ Создали сплошную
однородную кисть
g = PictureBox1.CreateGraphics
g.FillRegion(b, reg)’ Заполнили кистью всю поверхность PictureBox
или
g.FillEllipse(b, 10, 10, 100, 100)
или
g.FillPie(b, 150, 10, 120, 150, 90, 80)
или
Dim rec As New Rectangle(10, 10, 100, 100)
g.FillEllipse(b, rec)
или
Dim reg1 As New Region(rec)
g.FillRegion(b, reg1)’ Заполнили кистью только прямоугольную область
«Родные» методы для кистей, это – методы FillXXX()
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
7
g.Dispose()
reg.Dispose()
b.Dispose()
End Sub
Рисование кривых Безье выполняется методом DrawBezier, который
требует для своей реализации объект класса Pen и набор координат
точек перегиба кривой (рис. 1). Метод использует четыре точки, то
есть рисует кривую третьего порядка. Если необходимо нарисовать
кривую более высокого порядка, то ее необходимо спроектировать из
нескольких кривых Безье.
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button4.Click
Dim g As Graphics
g = PictureBox1.CreateGraphics
Dim p As New Pen(Color.Brown)
g.DrawBezier(p, 1, 60, 250, 200, 200, 90, 1, 300)
p.Dispose()
g.Dispose()
End Sub
Иногда необходимо вывести в форме миниатюрный символ (значок,
иконку) для акцентирования внимания пользователя. Это выполняется
методом DrawIcon, которому необходимо указать: что выводить и куда
выводить.
Для хранения файла с миниатюрным изображением создается объект
класса Icon: Dim ic As New Icon("C:\Program Files\Windows
Commander\Back.ico") с указанием местоположения файла с
расширением *.ico. Пример вывода иконки на рис.1.
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button5.Click
Dim g As Graphics
g = PictureBox1.CreateGraphics
Dim ic As New Icon("C:\Program Files\Windows Commander\Back.ico")
g.DrawIcon(ic, 1, 1)
g.Dispose()
End Sub
Очень интересные эффекты заливок замкнутых областей можно
достигнуть, используя методы градиентных заливок (рис.2). Добавьте
в проект еще одну форму и запрограммируйте градиентную заливку
формы.
Следующий пример отображает на фоне формы прямоугольник с
градиентной заливкой.
Imports System.Drawing.Drawing2D, System.Drawing.Brushes
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
8
Public Class Form5
Inherits System.Windows.Forms.Form
Private Sub Form5_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim rec As New Rectangle(5, 5, Me.ClientSize.Width - 10,
Me.ClientSize.Height - 10)
Dim p As New Pen(Color.Blue, 2)
e.Graphics.DrawRectangle(p, rec)
Dim b As New LinearGradientBrush(rec, Color.Blue, Color.Gold, 45)
e.Graphics.FillRectangle(b, rec)
End Sub
End Class
Рис. 2. Пример градиентной заливки
В последнем примере при рисовании используются размеры формы.
Поэтому целесообразно написать еще немного кода, объявляющего
форму недействительной при изменении ее размеров; это позволяет
гарантировать, что при перерисовке форма всегда будет заполняться
градиентной заливкой.
Private Sub Form5_Resize(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Resize
‘Этот вызов объявляет форму недействительной и заставляет
операционную систему Windows перерисовать форму
Me.Invalidate()
End Sub
Главный класс, который используется для работы со шрифтами в
GDI+, – это класс System.Drawing.Font. Объекты этого класса
представляют конкретные шрифты, установленные на компьютере. В
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
9
этом классе предусмотрено множество перегруженных конструкторов,
но вот пример двух, наиболее востребованных:
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = Me.CreateGraphics
Dim f As New Font("Arial", 20)
Dim f1 As New Font("Times New Roman", 20, FontStyle.Bold)
g.DrawString("Текст графический", f, New SolidBrush(Color.Red), 5, 5)
g.DrawString("Текст графический", f1, New SolidBrush(Color.Olive), 5,
30)
g.Dispose()
End Sub
Первый конструктор устанавливает шрифт и его размер, второй –
дополнительно параметры из перечисления FontStyle (рис. 3).
Рис. 3. Пример графического вывода текста
Самостоятельно
Создайте
проект,
представляющий
собой
MDI-форму,
с
соответствующими командами меню для реализации всех
рассмотренных графических методов. Пример меню и реализация
вывода кривой Безье показана на рис. 4.
Для выбора цвета разместите в форме не визуальный элемент
управления ColorDialog.
Рис. 4. Пример приложения
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
10
Задание 2. Обработчик события Paint
Задача
Вывести в форму или элементы управления графическое
изображение, исключив при минимизации или сокрытии формы его
искажение.
Решение
Поместить весь код рисования в обработчик события Control.Paint или
Form.Paint.
Обсуждение
При программировании отображения статической графики следует
учитывать возможные искажения при минимизации или сокрытии
формы. Решение проблемы возможно размещением всего кода
рисования в обработчике события Control.Paint (для элемента
управления) или Form.Paint (для формы). При сокрытии части формы
OC Windows автоматически объявляет всю ее графическую
информацию недействительной. При последующем отображении
формы Windows генерирует событие Paint, приказывая форме
перерисовывать себя. Таким образом, для правильного обновления
окна весь собственный код рисования всегда следует помещать в
обработчике события Paint, например:
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
или
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
Самостоятельно
1. Проведите эксперимент с формой из задания 1. Откройте
одновременно форму для второго задания и любую другую
форму (например, форму с загруженным файлом описания
задания). Изменяйте взаимное расположение форм и
наблюдайте эффекты перерисовки изображений при сокрытии
форм.
2. Используя обработчик события Paint, перепишите загрузку
графических изображений в форму задания 1 и элемент
управления PictureBox этой формы. Повторите эксперимент.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
11
Задание 3. Использование альтернативных единиц измерения
в GDI+
Задача
Разместить графические изображения на форме и элементах
управления, используя альтернативные точки отсчета для системы
координат и альтернативные единицы измерения.
Решение
Использовать свойство PageUnit и метод TranslateTransform объекта
Graphics.
Обсуждение
По умолчанию, система GDI+ использует в качестве единицы
измерения пиксел, а в качестве исходной точки начала отсчета
координат – верхний левый угол. Однако при помощи свойства
PageUnit объекта Graphics мы можем выбрать другую единицу
измерения, которая будет применяться к этому объекту. Например,
если мы производим вывод прямоугольника следующим образом:
Private Sub Form2_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
e.Graphics.DrawRectangle(New Pen(Color.Red, 5), 10, 10, 100, 100)
End Sub
Мы получаем прямоугольник размером 90x90 пикселов, отстоящий от
верхнего края формы на 10 пикселов вниз и вправо.
При помощи свойства PageUnit объекта Graphics мы можем выбрать
другую единицу измерения, которая будет применяться к этому
объекту. Для свойства PageUnit используются значения из
перечисления GraphicsUnit (display – 1/75 часть дюйма, document –
1/300 часть дюйма, inch – дюйм, millimeter – миллиметр, pixel – пиксел,
point – 1/72 часть дюйма).
Самостоятельно
Выведите прямоугольник не в пикселах, а в дюймах. Объясните
эффект, представленный на рис. 5.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
12
Рис. 5. Вывод изображения прямоугольника с применением различных единиц измерения
Вывод прямоугольника выполните более подробным способом:
создайте графический объект Graphics, получите контекст
графического вывода для формы (можно через аргумент события
Paint), создайте объект класса Pen и, наконец, вызовите метод
DrawRectangle у графического объекта.
Для изменения точки отсчета системы координат используйте метод
TranslateTransform(), определенный в классе Graphics. Например:
'Настраиваем единицы измерения
e.Graphics.PageUnit = GraphicsUnit.Point
'Настраиваем новую точку отсчета для системы координат
e.Graphics.TranslateTransform(100, 100)
e.Graphics.DrawRectangle(p, 10, 10, 100, 100)
Самостоятельно освойте возможность изменения точки начала
координат и реализуйте эту возможность для вывода графических
объектов в форме или элементе PictureBox.
Задание 4. Вывод изображений с помощью класса Image
Задача
Загружать графические изображения в элементы управления или
форму в коде программы.
Решение
Использовать класс System.Drawing.Image, его методы и свойства.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
13
Обсуждение
Форма и другие элементы управления, поддерживающие графику,
имеют свойства, позволяющие разместить в них графические
изображения на этапе проектирования. Для формы таким свойством
является BackgrounImage, для остальных элементов – это свойство
Image. На этапе программирования эти свойства так же доступны, но
для
загрузки
изображения
требуется
объект
типа
System.Drawing.Image, другими словами, код, написанный таким
образом, не выполнится:
Me.BackgroundImage = "c:\Windows\Лес.bmp"
Объекты класса System.Drawing.Image используются для вывода
растровых готовых изображений в форму или элементы управления.
Для программной загрузки изображений в элементы управления
можно использовать свойство Image элементов управления, которое
требует объект типа Image. Объект класса Image позволяет хранить
растровое изображение и имеет набор свойств и методов для
манипулирования этим изображением.
Существует несколько способов создания объекта класса Image,
попробуем использовать некоторые из них:
1. Объект класса Image можно создать на основе файла изображения.
Для этого используется метод FromFile класса Image:
Dim img As Image = Image.FromFile("Y:\vasnetsovap-kremlin.JPG")
PictureBox1.Image=img
2. Можно объявить переменную класса Image и присвоить ей
значение свойства Image элемента управления PictureBox1, в
котором изображение было размещено при проектировании:
Dim img As Image
img = PictureBox1.Image
Готовый объект Image можно присвоить свойству Image любого
другого элемента управления, например, PictureBox2:
PictureBox2.Image = img
− 3.Созданные объекты типа Image можно присваивать объектам типа
Bitmap. Например, предположим, что нам нужно вывести на форму
изображение. Мы можем объявить переменную Image, а затем
использовать для этой переменной объект типа Bitmap:
Dim imgA As Image
imgA = New Bitmap("c:\Windows\Лес.bmp")
Вывод полученного изображения можно выполнить другим способом.
Создать объект типа Graphics, а поскольку в классе Graphics
предусмотрен метод, который так и называется – DrawImage(), то
воспользоваться одним из перегруженных вариантов этого метода,
например, самым простым:
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
14
g.DrawImage(imgA, 10, 10, 90, 90)
Но это уже будет вывод изображения в указанные позиции (сравните с
п.1 и п.2).
Самостоятельно
1. Напишите код загрузки изображения из одного объекта Image в
PictureBox1, а из другого объекта Image в форму при загрузке
формы и изменение изображений по нажатию командной кнопки
(рис.6).
Рис. 6. Вывод изображений с помощью класса Image
2. Выведите на форму несколько изображений, используя объект
Image, связанный с объектом Bitmap. Класс Bitmap позволяет
выводить изображения, которые хранятся в файлах самого разного
формата, например, bmp, gif, jpg, png. Выполните вывод
изображений, хранящихся в различных форматах. Используйте для
вывода метод DrawImage объекта Graphics.
Задание 5. Свойства и методы класса Image
Задача
Изменять угол поворота изображения
Решение
Использовать свойство RotateFlip класса Image для поворота рисунка
и свойство Refresh для обновления изображения.
Обсуждение
Класс Image имеет набор свойств и методов, некоторые из них
представлены в табл.3.
Табл.3.
Свойства и методы класса Image
Название свойства/
метода
Назначение
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
HorizontalResolution,
VerticalResolution
Width, Height
RotateFlip
Refresh
GetThumbnailImage
15
Свойство: возвращают разрешения
изображения по горизонтали и вертикали в
пикселях на дюйм.
Свойство: возвращают высоту и ширину
изображения в пикселях.
Метод поворачивает рисунок или
выполняет его зеркальное отражение.
Синтаксис метода: Image.RotateFlip(type).
Аргумент type определяет способ поворота
рисунка, его значение выбирается из
перечисления RotateFlipType.
Метод
перерисовывает
элемент
управления
Метод возвращает миниатюрную версию
заданного
изображения.
Размеры
миниатюры задаются в его аргументах.
Синтаксис
метода:
Image.GetThumbnailImage(Width,
Height,Abort,Data)
Первые два аргумента – размеры
миниатюры. Два оставшихся используются
для обратной связи и позволяют прервать
процесс формирования миниатюры. Если
процесс прерывания не используется, этим
аргументам
присваивается
значение
Nothing.
Примечание.
Перечисленные свойства доступны только для чтения.
Самостоятельно
Напишите код загрузки графического изображения в элемент
управления PictureBox1 в обработчике события загрузки формы
Form_Load. Добавьте в форму командную кнопку, позволяющую
поворачивать изображение. Пример зеркального отображения по
вертикали (рис. 7):
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
16
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim img As Image = Image.FromFile("G:\vasnetsovap-kremlin.jpg")
PictureBox1.Image = img
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button2.Click
PictureBox1.Image.RotateFlip(RotateFlipType.Rotate90FlipX)
PictureBox1.Refresh()‘ метод перерисовывает элемент управления
End Sub
Рис. 7. Результат поворота изображения
Задание 6. Миниатюры
Задача
Отобразить уменьшенный вариант рисунка.
Решение
Используйте метод GetThumbnailImage класса Image, указав нужный
размер эскиза (thumbnail).
Обсуждение
Добавьте в проект новую форму. Поместите на форму кнопку
«Миниатюры» и напишите для нее программный код, реализующий
следующий алгоритм действий:
− С помощью элемента управления OpenFileDialog1 обеспечивается
возможность выбора файлов с рисунками. Элемент управления
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
17
OpenFileDialog необходимо переместить в форму, при этом
автоматически создается экземпляр класса OpenFileDialog1.
− Создаются элементы управления PictureBox и размещаются в
форме.
− В элементы PictureBox помещаются миниатюрные изображения по
нажатию командной кнопки.
Для создания элементов управления во время выполнения программы
нужно:
1. Объявить и создать объект класса PictureBox
Dim p As PictureBox
p= New PictureBox
2. Задать положение и размеры для вывода объекта в форме.
Point и Size – это стандартные классы, при помощи
которых задается месторасположение элемента и его
размеры
p.Location = New Point(10, 10)
p.Size = New Size(50, 50)
3. Для
того
чтобы
элемент
управления
содержал
изображение, файл с изображением предварительно
следует поместить в объект класса Image (в нашем случае
имя объекта img) и с помощью метода GetThumbnailImage
создать из него миниатюру
p.Image = img.GetThumbnailImage(50, 50, Nothing, Nothing)
4. Чтобы элемент управления был изображен, необходимо
добавить его в список элементов Controls
Me.Controls.Add(p)
Пример размещения миниатюр приведен на рисунке 4. Для создания
нескольких миниатюр можно описать массив создаваемых элементов
управления, инициировать каждый из них
Dim p(4) As PictureBox
p(i) = New PictureBox
и заполнять их изображениями в цикле. В этом случае следует
предусмотреть смещение позиции размещения элементов в форме.
Самостоятельно
Разработайте
проект,
позволяющий
изображения по щелчку мыши (рис. 8).
выводить
миниатюрные
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
18
Рис. 8. Пример размещения миниатюр
Задание 7. Вывод текста
Задача
Выполнить графический вывод текста.
Решение
Использовать метод DrawString для вывода текста и кисти Brush для
его градиентной заливки.
Обсуждение
Организуем вывод в форме текста, причем текст должен быть
отцентрирован и закрашен с помощью градиентной заливки (рис. 9).
Текст отображается методом DrawString. В качестве параметров этого
метода надо указать строку текста, шрифт (объект Font), кисть (объект
Brush; имеются несколько типов кистей; самыми популярными
являются SolidBrush – сплошная однородная и LinearGradientBrush –
градиентная кисть), а также координаты точки, с которой начинается
вывод текста.
Класс LinearGradientBrush располагается в пространстве имен
System.Drawing.Drawing2D. Свойство MeasureString возвращает
структуру SizeF, инкапсулирующую в себя параметры прямоугольника,
содержащего внутри указанную строку текста, отображаемую
заданным шрифтом. Кроме того, форма окаймлена овалом, покрытым
изображениям с фирменным логотипом МБИ.
Овал создается методом DrawEllipse. Перо, рисующее этот овал
(объект Pen), имеет ширину 120 пикселов, а в качестве своей основы
оно использует текстурную кисть (объект TextureBrush) с
изображением логотипа института.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
19
Рис. 9. Вывод центрированного текста
Итак, создайте форму, в программном коде укажите директиву
импорта класса Drawing2D пространства имен System.Drawing, а
затем напишите два обработчика событий: загрузки формы и
перерисовки формы.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
20
Imports System.Drawing.Drawing2D
Public Class Form3
Inherits System.Windows.Forms.Form
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.Width = 300
Me.Height = 300
End Sub
Private Sub Form3_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim str As String = "Наш институт"
Dim fnt As Font = New Font("Arial", 20, FontStyle.Bold)
Dim w As Integer = Me.ClientSize.Width
Dim h As Integer = Me.ClientSize.Height
Dim g As Graphics = e.Graphics
Dim br As Brush = New LinearGradientBrush(New PointF(0, 0), New
PointF(Me.Width, Me.Height), Color.Red, Color.Yellow)
Dim sw As Single = g.MeasureString(str, fnt).Width
Dim sh As Single = g.MeasureString(str, fnt).Height
g.Clear(Color.White)
g.DrawString(str, fnt, br, (w - sw) / 2, (h - sh) / 2)
g.DrawEllipse(New Pen(New TextureBrush(Image.FromFile("Y:\logo.jpg"),
WrapMode.Tile),120),0,0,w,h)
End Sub
End Class
Самостоятельно
Разработайте проект своей надписи, обрамленной любой кистью
(простой, с текстурой или текстом).
Задание 8. Повернутая надпись
Задача
Выполнить поворот графической надписи.
Решение
Использовать экземпляр класса GraphicsPath для хранения надписи и
метод Transform этого класса для поворота надписи.
Обсуждение
Поворачивать можно не только фигуры, но и надписи (рис. 10). Для
этого, например, достаточно на основе надписи построить
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
21
графический путь, т.е. создать экземпляр класса GraphicsPath, а
затем, используя его метод Transform, совершить над ним указанные
аффинные преобразования – в данном случае поворот вокруг
указанной точки. Аффинные преобразования координат надписи
следует выполнить методом RotateAt класса Matrix.
Рис. 10. Повернутая надпись
Для реализации задачи создайте форму, укажите директиву импорта
класса Drawing2D пространства имен System.Drawing, добавьте
инструкции из листинга, приведенного ниже.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
22
Imports System.Drawing.Drawing2D
Public Class Form4
Inherits System.Windows.Forms.Form
Private spaces As String = " "
Private str As String = "IBI-наш институт"
Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.BackColor = Color.White
Me.Width = 400
Me.Height = 450
str = spaces & str
End Sub
Private Sub Form4_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim gp As GraphicsPath = New GraphicsPath
Dim pt As PointF = New PointF(Me.Width / 2,Me.Height/2)
Dim ff As FontFamily = New FontFamily("Arial")
gp.AddString(str, ff, FontStyle.Bold, 20, pt, StringFormat.GenericDefault)
Dim RotateMatrix As Matrix = New Matrix
Dim g As Graphics = e.Graphics
Dim i As Integer
g.DrawPath(New Pen(Color.DarkOrange, 2), gp)
Dim angle As Integer = 45
For i = 0 To 360 \ angle
RotateMatrix.RotateAt(angle, pt)
gp.Transform(RotateMatrix)
g.DrawPath(New Pen(Color.DarkOliveGreen, 2), gp)
Next
End Sub
End Class
В тексте программы используется класс Matrix, использование
которого необходимо пояснить.
Класс Matrix позволяет задавать аффинные преобразования
координат, тем самым существенно упрощая процесс создания
анимационных изображений, связанных с движением. Достаточно
создать графическое изображение в одной системе координат, а
затем просто перемещать и изменять саму систему координат, а не
изображение.
Самостоятельно
Используя технологию класса Matrix, разработайте форму-заставку к
одному из своих проектов.
Download