МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ 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, разработайте форму-заставку к одному из своих проектов.