Анимация объектов в диалоговых Windows-приложениях, способы создания
Принципы работы с графикой средствами GDI+. Пространство имен и служебные типы System. Drawing. Возможности класса Graphics. Использование программного компонента "Таймер". Графическое Windows-приложение "Созвездие", его структура и элементы, функции.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 03.03.2016 |
Размер файла | 348,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Анимация объектов в диалоговых Windows-приложениях, способы создания
Введение
графика программный служебный приложение
Приложения с графикой, игры, Computer Aided Design/Computer Aided Manufacture (CAD/CAM - проектирование / производство с помощью компьютера), программы для рисования, для создания графиков и многие другие типы приложений требуют от разработчиков написания кода для работы с графикой. Использование создаваемых пользователем управляющих элементов также предполагает работу с графикой.
Посредством последней библиотеки классов компания Microsoft сделала написание кода для работы с графикой как никогда простым. Для рисования объектов в Windows Forms - приложениях язык С# содержит богатый набор типов и методов. Специально для.NET-платформы разработчики Microsoft разработали GDI+ библиотеку, значительно повысив возможности GDI (Graphic Device Interface). GDI+ включает возможности рисования простейших объектов (линии, эллипсы…), рисование различных объектов 2D графики, отображение файлов различных графических форматов (bmp, jpeg, gif, wmf, ico, tiff…) и многое другое.
При написании графического кода следует всегда помнить, что Microsoft Windows не запоминает, каким образом выглядит данное графическое окно, если оно заслоняется другими окнами. Если закрытое ранее окно оказывается на переднем плане и становится видимым, то система Windows сообщает приложению, что окно (или некоторая его часть) становится видимым и его можно нарисовать. На приложение возлагается только задача рисования содержимого окна. Вывод границ окна, линейки с заголовком и прочих графических составляющих самого окна система Windows берет на себя. При создании окна, в котором мы собираемся что-либо нарисовать, следует либо объявить класс, который является производным от System.windows. Forms. Form, либо, если мы создаем собственный управляющий элемент, объявить класс, который является производным от System.windows. Form.userControl. В обоих случаях придется переопределять виртуальную функцию onPaint(). В ОС Windows будет происходить обращение к этой функции всякий раз, когда возникает необходимость повторного рисования любой части окна. При наступлении этого события класс PaintEventArgs передается в качестве аргумента.
Целью курсовой работы - является изучения вывода на форму графики (изображения и текста), способов создания анимации графических объектов.
Объектом исследования является процесс создания анимации графический объектов.
Предметом исследования является использование анимации графических объектов в современных приложениях различного типа.
1. Принципы работы с графикой средствами GDI+
1.1 Пространство имён GDI+
GDI расшифровывается как Graphic Device Interface (интерфейс графических устройств). Этим словом обозначается подсистема Windows, предназначенная для вывода графических изображений на экран и на принтер (ОС Windows вся основана на использовании графики). GDI+ - это новый набор программных интерфейсов, используемый в.NET.
В.NET предусмотрено множество пространств имен, предназначенных для вывода двумерных графических изображений. Помимо ожидаемых стандартных типов (например, для работы с цветом, со шрифтами, с пером и кистью, с изображениями) в этих пространствах имён предусмотрены типы для выполнения достаточно изощренных операций, таких как геометрические преобразования, сглаживание неровностей, подготовка палитры, поддержка вывода на принтер и многие другие. Перечень наиболее важных пространств имен для работы с графическими изображениями представлен в табл. 1.1.1
Таблица 1.1.1. Наиболее важные пространства имен GDI+
Пространство имен |
Специализация |
|
System. Drawing |
Важнейшее пространство имен GDI+, которое содержит основные типы для вывода графики (для работы со шрифтами, перьями, кистью и т.п.), а также исключительно важный тип Graphics |
|
System, Drawing, Drawing2D |
В этом пространстве имен предусмотрены типы для выполнения более сложных операций с двумерной графикой (градиентная заливка, геометрические преобразования и т.п.) |
|
System. Drawing. Imaging |
Здесь определены типы, которые позволяют напрямую работать с графическими изображениями (менять палитру, извлекать метаданные изображений, выполнять операции с метафайлами и т.п.) |
|
System. Drawing. Text |
Это пространство имен позволяет работать с системными шрифтами. Например, тип FontColiection позволяет получать список всех установленных в системе и шрифтов. |
Чтобы обеспечить возможность работы с графикой в приложении, необходимо добавить в него ссылку на сборку System. Drawing.dll. После этого нам необходимо добавить в список используемых пространств имен строку using System. Drawing; и можно приступать к работе с графикой. Если приложение имеет шаблон Windows Application, то эта ссылка будет добавлена автоматически.
1.2 Пространство имен System. Drawing
Подавляющее большинство типов для работы с графикой, находятся в пространстве имен System. Drawing. Некоторые наиболее важные типы этого пространства имён представлены в табл. 1.2.1
Таблица 1.2.1. Типы пространства имен System. Drawing
Тип |
Назначение |
|
Bitmap |
Инкапсулирует файл изображения и определяет набор методов для выполнения различных операций с этим изображением |
|
Brush Brushes SolidBrush SystemBrushes TextureBrush |
Объекты Brush (кисть) используются для заполнения пространства внутри геометрических фигур (например, прямоугольников, эллипсов или многоугольников). Тип Brush - это абстрактный базовый класс, остальные типы являются производными от Brush и определяют разные наборы возможностей. Дополнительные типы Brush определены в пространстве имен System. Drawing. Drawing2D |
|
Graphics |
Этот важнейший класс определяет набор методов для вывода текста, изображений и геометрических фигур. Можно считать этот тип эквивалентом типа НОС в Win32 |
|
Image ImageAnimator |
Imagе - это абстрактный базовый класс, который обеспечивает возможности типов Bitmap, Icon и Cursor. ImageAnimator позволяет производить показ изображений (типов, производных от Image) через указанные вами интервалы времени |
|
Pen Pens SystemPens |
Pen (перо) - это класс, при помощи которого можно рисовать прямые и кривые линии. В классе Реn определен набор статических свойств, при помощи которых можно получить объект Реn с заданными свойствами (например, с установленным цветом) |
|
Point PointF |
Эти структуры обеспечивают работу с координатами точки. Point работает со значениями типа int, a PointF - со значениями типа float |
|
Region |
Определяет область, занятую геометрической фигурой |
1.3 Служебные типы System. Drawing
Многие методы, определенные в классе Graphic, требуют указания положение или область для вывода графического объекта. Например, при использовании метода DrawString() необходимо указать местонахождение выводимой текстовой строки на элементе управления. Метод DrawString() многократно перегружен, но один из наиболее часто используемых вариантов требует указания координат (х, у) или прямоугольной области для вывода. Другим часто используемым методам необходимо передавать размеры (высоту и ширину) прямоугольной области, в которую будет производиться вывод, или, если область вывода будет не прямоугольной, задать эту область другим способом.
Для передачи методам подобной информации в пространстве имен System. Drawing предусмотрены типы Point, Rectangle, Region и Size. Point используется для передачи координат (х, у). Rectangle определяет координаты двух точек, которые будут восприняты как верхний левый и нижний правый углы прямоугольника. Тип Size определяет размер прямоугольной области в каком-либо измерении (то есть используется для указания высоты или ширины). Тип Region необходим для работы с непрямоугольными областями.
Внутренние переменные, используемые для хранения данных в Point, Rectangle и Size, являются целочисленными (то есть относятся к типу int). Если возникла необходимость указывать координаты или размеры при помощи значений с плавающей запятой (тип float), то в нашем распоряжении типы PointF, RectangleF и SizeF. Они отличаются лишь форматом внутренних переменных (fIoat вместо int). Наборы членов у них одинаковы.
Тип Point(F)
Первый служебный тип System. Drawing. Point (F). Наиболее важные члены этого класса представлены в табл. 1.3.1
Несмотря на то, что этот тип чаще всего используется в приложениях GDI+ с графическим пользовательским интерфейсом, его вполне можно использовать в приложениях любого типа.
Таблица 1.3.1. Члены типа Point (PointF)
Член |
Назначение |
|
+ - = != |
Перегруженные операторы для выполнения различных действий с координатами х и у |
|
Х y |
Эти свойства позволяют получать и устанавливать значения координат х и у |
|
IsEmpty |
Это свойство возвращает true, если значения х и у равны нулю |
|
Offset() |
Этот метод позволяет произвести смещение точки относительно исходной позиции |
Тип Size(F)
Типы Size и SIzeF простые в применении и практически не требуют комментариев. Эти структуры обеспечивают работу с размерами. Краткий перечень членов этих типов представлен в табл. 1.3.2
Таблица 1.3.2. Члены типов Size и SizeF
Член |
Назначение |
|
+ - = != |
Перегруженные операторы |
|
Height Width |
Эти свойства определяют высоту и ширину - два размера, с которыми работает Size(F) |
1.4 Возможности класса Graphics
Все возможности вывода изображений в GDI+ представлены именно в этом классе. Можно считать этот класс неким виртуальным устройством, на которое производится вывод графики. В Graphics определено очень большое количество методов для вывода текста, изображений, геометрических фигур и т.п. Наиболее часто используемые методы этого класса представлены в табл. 1.4.1
Таблица 1.4.1. Некоторые методы класса Graphics
Метод |
Назначение |
|
FromHdc() FromHwnd() Fromlmage() |
Эти статические методы обеспечивают возможность получения объекта Graphics из элемента управления или изображения |
|
Clear() |
Заполняет объект Graphics выбранным пользователем цветом, удаляя его предыдущее содержимое |
|
DrawArc() DrawBezler() DrawBeziers() DrawCurve() DrawEllipse() DrawIcon() DrawLine() DrawString() |
Эти методы (как и многие другие) предназначены для вывода изображений и геометрических фигур |
|
FillElllpse() FillPath() FillPie() FillPolygon() FillRectangle() |
Эти методы предназначены для заполнения внутренних областей графических объектов |
В классе Graphics также определен набор свойств, при помощи которых можно настраивать параметры графических объектов. Наиболее важные свойства представлены в табл. 1.4.2
Таблица 1.4.2. Свойства класса Graphics
Свойство |
Назначение |
|
Clip Graphics ClipBounds VisibleClipBounds IsClipEmpty IsVisibleClipEmpty |
Эти свойства позволяют настроить параметры отсечения для объекта |
|
Transform |
Для проведения преобразований координат |
|
PageUnit PageScale DpiX DpiY |
Эти свойства позволяют задать «место происхождения» операции вывода графического объекта и единиц измерения |
|
SmoothingMode PixelOffsetMode TextRenderingHint |
Позволяют задать плавность переходов для геометрических объектов и текста. Устанавливаются при помощи значений из соответствующих перечислений, определенных в пространствах имен System. Drawing и System. Drawing2D |
|
Compositing Mode CompositingQuality |
Свойство Com positing Mode определяет, будет ли выводимый графический объект выводиться над фоном или будет происходить смешение с фоном. Используются значения из перечисления CompositingMode, определенном в пространстве имен System. Drawing2D. CompositingQuality определяет параметры процесса смешивания. Для него используются значения из перечисления CompositingQuality, также определенном в пространстве имен System. Drawing2D |
|
InterpolationMode |
Определяет интерполяцию между конечными точками. Используются значения из соответствующего перечисления |
1.5 Обзор пространства имен System. Drawing. Drawing2D
Самые простые варианты типов Реn (перо) и Brush (кисть) определены в пространстве имен System. Drawing. Однако есть гораздо более интересные перья и кисти, которые представлены в пространстве имен System. Огаing. Drawlng2D.
Это дополнительное пространство имен GDI+ (со значительно меньшим количеством типов, чем System. Drawing) обеспечивает возможность устанавливать специальные «наконечники» для перьев (pen caps), создавать кисти, которые рисуют не сплошной полосой, а текстурами, производить различные векторные манипуляции с графическими объектами. Некоторые наиболее интересные типы этого пространства имен представлены в табл. 1.5.1
Таблица 1.5.1. Классы System. Drawing. Drawing2D
Класс |
Назначение |
|
AdjustableArrowCap CustomLJneCap |
Определяют «наконечники» для перьев. В результате исходная точка и конец линии получают характерные завершения. Можно использовать выбранный пользователем вариант: или стрелки на конце линии (AdjustableArrowCap), или полностью определенное им самим завершение (Custom LineCap) |
|
Blend ColorBlend |
Используются для смешивания цветов. Обычно используются вместе с LinearGradientBrush |
|
GraphicsPath GraphicsPath Iterator |
Объект GraphicsPath представляет набор связанных линий (прямых и кривых). В данный объект можно поместить практически любой тип геометрической фигуры (например, дуги, прямоугольники, отрезки прямой линии, многоугольники и т.п.) |
|
PathData |
Хранит графические данные для GraphicsPath |
|
HatchBrush LinearGradientBrush PathGradientBrush |
Экзотические типы кистей |
Для этих типов используются значения из перечислений, также определенных в пространстве имен System. Drawl rig. Drawi ng2D. Эти перечисления представлены в табл. 1.5.2
Таблица 1.5.2. Перечисления System. Drawing. Drawing2D
Перечисление |
Назначение |
|
DashStyle |
Определяет стиль штриховых линий для пера |
|
FillMode |
Определяет заполнение внутренней области геометрической фигуры |
|
HatchStyle |
Определяет варианты штриховки (для объектов HatchBrush) |
|
LinearGradientMode |
Определяет направление градиентного изменения цвета |
|
LineCap |
Определяет стиль «наконечника» пера |
|
PenAlignment |
Определяет ориентацию пера относительно проводимой им линии |
|
РепТуре |
Определяет тип линии, создаваемой пером |
|
QualityMode SmoothingMode |
Определяют качество вывода графического объекта |
1.6 Вывод изображений
Для вывода изображения на форму есть два способа. Первый заключается в описании необходимой логики в метод OnPaint(). Второй предусматривает перехват события Paint.
Вне зависимости от того, какой метод используется, механизм вывода графики будет одним и тем же. Как только приложение станет «грязным», в очереди сообщений для этого приложения появится специальное сообщение, инициирующее сеанс вывода графики (перерисовки). Приложение становится «грязным» тогда, когда изменяются его размеры, когда его окно полностью или частично перекрывается окном другого приложения, когда оно восстанавливается из минимизированного состояния. В результате либо вызывается метод OnPaint(), либо срабатывает наш обработчик события Paint.
Иногда возникает необходимость инициировать перерисовку изображения на форме вручную (иными словами, программным образом поместить в очередь сообщений сообщение о необходимости перерисовки). Например, в программе может быть предусмотрено диалоговое окно для выбора пользователем изображения. После того как пользователь выберет то, что ему нужно, форму необходимо будет перерисовать, чтобы отобразить выбранное изображение.
Для того чтобы инициировать перерисовку формы программным образом, используется метод Invalidate().
Существует множество перегруженных вариантов метода Invaldate(). Например, указать конкретную прямоугольную область, подлежащую перерисовке, вместо всей клиентской части формы (она перерисовывается по умолчанию).
Очень часто бывает так, что вывод графического объекта необходимо произвести не в стандартных ситуациях, когда возникает событие Paint, а в ответ на другие события. Например, для того что бы вывести маленький кружок в том месте, где на форме был сделан щелчок мышью, нужно при выводе изображений получить объект Graphics, а затем выполнить с этим объектом необходимые манипуляции. Объект Graphics можно получить при помощи метода Graphics. FromHwnd().Единственный параметр, передаваемый этому методу, - это значение свойства Handle. Свойство Handle, определено в классе Control и наследуется всеми классами, производными от Control.
При любой перерисовке формы (возникновении события Paint) все кружки, выведенные на форме после щелчков мышью, исчезнут. Так как, вывод графических объектов (кружков) в нашем случае происходит только в результате щелчка мышью, но не при выводе формы на экран.
Однако в приложении потребуется не только выводить какие-либо графические объекты на форму, но и сохранять их при перерисовке формы, что бы они не пропали необходимо позаботиться о том, чтобы информация о графических объектах каким-то образом сохранялась и использовалась при перерисовке формы. Самый простой способ - создать внутреннюю коллекцию (например, при помощи класса ArrayList) и помещать туда нужные нам объекты. Затем к этой коллекции будет обращаться метод OnPaint().
Таким образом, использование метода Graphics. FromHwnd() - это один из способов получить объект Graphics без использования события Paint.
2. Способы создания анимации объектов
2.1 Методы перемещения
Для перемещения картинки(Image) по форме можно воспользоваться тремя методами.
Первый метод заключается в том, что свойства Left и Top картинки изменяются на разницу между начальными и конечными координатами (нажатия и отпускания мыши соответственно). Этот способ самый простой и надежный, но у него есть один недостаток: left и top изменяются по очереди, что приводит к заметному мерцанию картинки. Необходимо положить на форму Image и вставить в нее какую-нибудь картинку. Для начала объявляем глобальные переменные (они объявляются в разделе Implementation) x0, y0:integer - они будут запоминать начальные координаты. Так же будет использоваться переменная move типа boolean,
Второй метод: у некоторых компонентов, в том числе и Image, есть такая процедура SetBounds (Left, Top, Width, Height), которая может изменять сразу все четыре параметра. Таким образом, событие OnMouseMove можно изменить так:
procedure TForm1. Image1MouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if move then begin
image1. SetBounds (image1. Left+x-x0, image1. Top+y-y0, image1.width, image1.height);
end;
end;
Также по экрану можно перемещать не саму картинку, а только ее рамку, когда пользователь выберет место для картинки и отпустит кнопку - она туда переместиться. Для этого понадобится еще одна глобальная переменная: rec: TRect, которая будет хранить параметры картинки. Теперь слегка изменим обработчики событий для картинки. Таким образом, все в целом будет выглядеть так:
procedure TForm1. Image1MouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false
else begin
move:=true;
x0:=x;
y0:=y;
rec:=image1. BoundsRect; // запоминаем контур картинки
end;
end;
procedure TForm1. Image1MouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if move then begin
Form1. Canvas. DrawFocusRect(rec); // рисуем рамку
with rec do begin
left:=Left+x-x0;
top:=Top+y-y0;
right:=right+x-x0;
bottom:=bottom+y-y0;
x0:=x;
y0:=y; // изменяем координаты
end;
Form1. Canvas. DrawFocusRect(rec); // рисуем рамку на новом месте
end;
end;
procedure TForm1. Image1MouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Form1. Canvas. DrawFocusRect(rec);
with image1 do begin
setbounds (rec.left+x-x0, rec.top+y-y0, width, height); // перемещаем картинку
move:=false;
end;
end;
Поскольку DrawFocusRect рисует рамку методом Xor, то при повторном вызове этой функции с теми же параметрами, рамка стирается.
Третий метод: свойство Control. Location получает или задает координаты левого верхнего угла элемента управления относительно левого верхнего угла контейнера. Поскольку класс Point является типом значения (Structure в Visual Basic, struct в Visual C#), он возвращается в виде значения, т.е. при доступе к свойству возвращается копия точки левого верхнего угла элемента управления. Поэтому корректировка свойства X или Y объекта Point, возвращенного данным свойством, не повлияет на значения свойств Left, Right, Top и Bottom элемента управления. Чтобы скорректировать эти свойства, задайте каждое значение свойства отдельно или задайте свойство Location с новым объектом Point. Если объект Control является объектом Form, значение свойства Location представляет левый верхний угол Form в экранных координатах.
В следующем примере кода создается объект GroupBox и задаются некоторые его общие свойства. В примере создается объект TextBox и задается его свойство Location, определяющее расположение внутри группы. Затем задается свойство Text группы, которая далее закрепляется в верхней части формы. Наконец, группа отключается посредством задания для свойства Enabled значения false, что приводит к отключению всех элементов управления, содержащихся в группе.
private void AddMyGroupBox()
{
// Create a GroupBox and add a TextBox to it.
GroupBox groupBox1 = new GroupBox();
TextBox textBox1 = new TextBox();
textBox1. Location = new Point (15, 15);
groupBox1. Controls. Add(textBox1);
// Set the Text and Dock properties of the GroupBox.
groupBox1. Text = «MyGroupBox»;
groupBox1. Dock = DockStyle. Top;
// Disable the GroupBox (which disables all its child controls)
groupBox1. Enabled = false;
// Add the Groupbox to the form.
this. Controls. Add(groupBox1);
}
2.2 Использование программного компонента «Таймер»
Таймер - это устройство, периодически уведомляющее приложение о завершении заданного интервала времени. Ваша программа устанавливает этот интервал, как бы говоря: «'Предупреждай меня каждую десятую долю секунды», - и таймер вызывает обработчик события десять раз в секунду.
В пространствах имен System. Timers, System. Threading и SystemWindowsforms определены три разных класса с именем Timer. Таймер, который определен в пространстве SystemWindowsforms, совмещен с другими событиями Windows и наиболее прост в использовании.
Хотя таймер и не столь важное устройство ввода, как клавиатура или мышь, он все же может быть очень полезен и находит применение во многих приложениях Windows Forms. Наиболее очевидным приложением для таймера является программа-часы. Однако есть и другие, возможно, не такие очевидные области применения таймера.
* Многозадачность хотя Windows является средой с вытесняющей многозадачностью, рекомендуется, чтобы после обработки события программы возвращали управление Windows как можно быстрее. Иначе темп может существенно замедлиться. Если программа должна выполнить большой объем работы, ее можно разделить на несколько частей и выполнять каждую часть по получении события таймера.
* Обновление данных Таймер подходит для обновления постоянно изменяющейся информации, например, при выводе данных о свободных ресурсах или проценте выполнения какой-либо задачи.
* Автосохранение Таймер позволяет периодически сохранять на диске результаты работы программы.
* Прекращение работы демо-версий программ. Некоторые демо-версии программ самостоятельно завершаются, скажем, через 30 минут после запуска. В таких приложениях таймер подает сигнал на прекращение работы. (Пример такой программы, CloselnFive)
* Пошаговое продвижение. Обычно необходимо с заданной скоростью перемещать графические объекты в игре или переключать страницы в программах-описаниях. Таймер помогает избежать несовместимости, связанной с разными скоростями процессоров. Таймер часто применяют в анимации.
Таймер можно рассматривать и как гарант, обеспечивающий передачу управления программе. Если после выполнения конструктора или обработчика события программа отдает управление, обычно нельзя определить, когда произойдет следующее событие. Оно в таймере более определенно, так как таймер не обладает ритмичностью метронома. События, вырабатываемые классом Timer, синхронизированы с другими событиями.
Иначе говоря, событие таймера никогда не прервет процедуру обработки другого события, выполняющуюся в том же потоке. Если обработка события идет слишком долго, она задержит событие таймера.
Класс Timer. Класс Timer невелик и относительно прост. Обычно объект Timer создается конструктором по умолчанию: Timer timer = new Timer(); Основные свойства класса представлены в табл. 2.2.1
Таблица 2.2.1. Основные свойства класса Timer
CanRaiseEvents |
Возвращает значение, показывающее, может ли компонент вызывать событие |
|
DesignMode |
Возвращает значение, указывающее, находится ли данный компонент Component в режиме конструктора в настоящее время |
|
Enabled |
Возвращает или задает, запущен ли таймер |
|
Events |
Возвращает список обработчиков событий, которые прикреплены к этому объекту Component |
|
Interval |
Возвращает или задает время в миллисекундах перед Tick событие возникает по отношению к последнему вхождению Tick событие |
Основные методы представлены в табл. 2.2.2
Таблица 2.2.2. Основные методы класс Timer
CreateObjRef |
Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для взаимодействия с удаленным объектом |
|
Dispose() |
Освобождает все ресурсы, используемые объектом Component |
|
Finalize |
Освобождает неуправляемые ресурсы и выполняет другие операции очистки, перед тем как объект Component будет удален при сборке мусора |
|
OnTick |
Вызывает Tick событие |
|
Start |
Запускает таймер |
|
Stop |
Останавливает таймер |
|
ToString |
Инфраструктура. Возвращает строку, представляющую Timer |
Заключение
Работа с графикой весьма трудоёмкий и при этом интересный процесс. Средствами GDI+ этот процесс максимально упрощается и облегчается. Визуализация графических данных средствами GDI+ позволяет расширять функциональные возможности Windows Forms, а именно улучшить дизайн интерфейсов как Web, так и Windows-приложений.
В результате выполнения данной курсовой работы:
произведён обзор пространства имён GDI+, System. Drawing,
System. Drawing. Drawing2D;
изучены типы и классы пространства имён System. Drawing;
приобретены практические умения создания анимации графических
объектов;
разработано демонстрационное графическое Windows-приложение
«Созвездие», которое может быть использовано в астрономии, при
изучении созвездий.
Анимацию графический объектов можно представить тремя способами, один из которых был применён в практической части. Кроме того, были рассмотрели многочисленные возможности объекта Graphics и приемы работы с ним.
Цель и задачи курсовой работы были выполнены.
Литература
1. Троелсен, Э. Язык программирования С# 2005 и платформа.NET 2.0 / Э. Троелсен. - 3-е издание. - Москва-Санкт-Петербург-Киев: Издательский дом «Вильямс», 2007. - 1168 с.
2. Шилдт, Г. Полный справочник по С# / Г. Шилдт. - Москва: Санкт-Петербург; Киев: Издательский дом «Вильямс», 2006. - 750 с.
3. Прайс, Дж. Visual C#.NET/ Дж. Прайс, М. Гандерлой - Полное руководство. - Киев: ВЕК, Санкт-Петербург: КОРОНА, 2004. - 960 с.
Приложение
Графическое Windows-приложение «Созвездие»
Главное окно приложения (рис. 1):
using System;
using System. Collections. Generic;
using System. ComponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
using System. Windows. Forms;
namespace звёзды
{
public partial class Form1: Form
{
public Form1 ()
{
InitializeComponent();
}
private void button1_Click (object sender, EventArgs e)
{
this. Hide();
Form2 Ob = new Form2 ();
Ob. ShowDialog();
}
private void button4_Click (object sender, EventArgs e)
{
DialogResult Rez = MessageBox. Show («Выйти из приложения», «Окно выхода», MessageBoxButtons. YesNo);
{
if (Rez == DialogResult. Yes)
Application. Exit();
}
}
private void button2_Click (object sender, EventArgs e)
{
this. Hide();
Form3 Ob = new Form3 ();
Ob. ShowDialog();
}
private void button3_Click (object sender, EventArgs e)
{
this. Hide();
Form4 Ob = new Form4 ();
Ob. ShowDialog();
}
private void button5_Click (object sender, EventArgs e)
{
this. Hide();
Form5 Ob = new Form5 ();
Ob. ShowDialog();
}
private void Form1_Load (object sender, EventArgs e)
{
}
private void button6_Click (object sender, EventArgs e)
{
this. Hide();
Form6 Ob = new Form6 ();
Ob. ShowDialog();
}
}
}
Рисунок 1
Фрагмент программного кода для создания анимации созвездия «Дева» (рис. 2):
using System;
using System. Collections. Generic;
using System. ComponentModel;
using System. Data;
using System. Drawing;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
using System. Windows. Forms;
namespace звёзды
{
public partial class Form2: Form
{
System. Drawing. Bitmap poln, poln1, poln2, poln3, poln4, poln5, poln6, poln7;
// Graphics g;
public Form2 ()
{
InitializeComponent();
pictureBox1. Paint += pictureBox1_Paint;
}
void pictureBox1_Paint (object sender, PaintEventArgs e)
{
DrawStars(e);
}
private void Form2_Load (object sender, EventArgs e)
{
}
Random rand = new Random();
Timer timer1 = new Timer();
void DrawStars (PaintEventArgs e)
{
e. Graphics. Clear (Color. Black);
{
for (int x0 = 10; x0 < e. ClipRectangle. Width; x0 = x0 + 9)
{
int y0;
y0 = rand. Next (0, 524);
int n = 6; // число вершин
double R = 2, r = 5; // радиусы
double alpha = 0; // поворот
// центр
PointF[] points = new PointF [2 * n + 1];
double a = alpha, da = Math.PI / n, l;
for (int k = 0; k < 2 * n + 1; k++)
{
l = k% 2 == 0? r: R;
points[k] = new PointF((float) (x0 + l * Math. Cos(a)), (float) (y0 + l * Math. Sin(a)));
a += da;
}
e. Graphics. DrawLines (Pens. Blue, points);
timer1. Start();
timer1. Interval = 5000;
timer1. Enabled = true;
}
}
}
private void pictureBox1_Click (object sender, EventArgs e)
{
Graphics g = pictureBox1. CreateGraphics();
g. Clear (Color. Black);
}
private void button1_Click (object sender, EventArgs e)
{
timer2. Enabled = false;
Pen pero = new Pen (Color. Yellow, 2);
Graphics f = pictureBox1. CreateGraphics();
f. DrawLine (pero, 85, 240, 125, 200); // первая линия
f. DrawLine (pero, 125, 200, 185, 170); // 2
f. DrawLine (pero, 185, 170, 230, 170); // 3
f. DrawLine (pero, 230, 170, 280, 160); // 4
f. DrawLine (pero, 280, 160, 295, 120); // 5
f. DrawLine (pero, 125, 200, 80, 140);
f. DrawLine (pero, 185, 170, 160, 130);
f. DrawLine (pero, 160, 130, 155, 90);
SolidBrush mySe = new SolidBrush (Color. Yellow);
f. DrawEllipse (pero, 82, 238, 7, 7);
f. FillEllipse (mySe, 82, 238, 7, 7);
f. DrawEllipse (pero, 123, 197, 5, 5);
f. FillEllipse (mySe, 123, 197, 5, 5);
f. DrawEllipse (pero, 80, 140, 5, 5);
f. FillEllipse (mySe, 80, 140, 5, 5);
f. DrawEllipse (pero, 159, 130, 5, 5);
f. FillEllipse (mySe, 159, 130, 5, 5);
f. DrawEllipse (pero, 154, 90, 6, 6);
f. FillEllipse (mySe, 154, 90, 6, 6);
f. DrawEllipse (pero, 183, 167, 5, 5);
f. FillEllipse (mySe, 183, 167, 5, 5);
f. DrawEllipse (pero, 230, 167, 5, 5);
f. FillEllipse (mySe, 230, 167, 5, 5);
f. DrawEllipse (pero, 279, 157, 5, 5);
f. FillEllipse (mySe, 279, 157, 5, 5);
f. DrawEllipse (pero, 293, 120, 5, 5);
f. FillEllipse (mySe, 293, 120, 5, 5);
}
private void button2_Click (object sender, EventArgs e)
{
this. Hide();
Form1 Ob = new Form1 ();
Ob. ShowDialog();
}
private void button3_Click (object sender, EventArgs e)
{
DialogResult Rez = MessageBox. Show («Выйти из приложения», «Окно выхода», MessageBoxButtons. YesNo);
{
if (Rez == DialogResult. Yes)
Application. Exit();
}
}
int i;
private void timer3_Tick (object sender, EventArgs e)
{
if (i == 0)
{
i = 1;
poln = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 1.bmp»), 50, 50));
poln. MakeTransparent();
pictureBox2. Image = (poln);
}
else
if (i == 1)
{
i = 2;
poln2 = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 2.bmp»), 50, 50));
poln2. MakeTransparent();
pictureBox2. Image = (poln2);
}
else
if (i == 2)
{
i = 3;
poln3 = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 3.bmp»), 50, 50));
poln3. MakeTransparent();
pictureBox2. Image = (poln3);
}
else
if (i == 3)
{
i = 4;
poln4 = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 4.bmp»), 50, 50));
poln4. MakeTransparent();
pictureBox2. Image = (poln4);
}
else
if (i == 4)
{
i = 5;
poln1 = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 5.bmp»), 50, 50));
poln1. MakeTransparent();
pictureBox2. Image = (poln1);
}
else
if (i == 5)
{
i = 6;
poln5 = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 6.bmp»), 50, 50));
poln5. MakeTransparent();
pictureBox2. Image = (poln5);
}
else
if (i == 6)
{
i = 7;
poln6 = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 7.bmp»), 50, 50));
poln6. MakeTransparent();
pictureBox2. Image = (poln6);
}
else
if (i == 7)
{
i = 0;
poln7 = new Bitmap (new Bitmap (new Bitmap («D:// работы // курсовая // Для Лазовской В // Луна // 8.bmp»), 50, 50));
poln7. MakeTransparent();
pictureBox2. Image = (poln7);
}
}
Pen pero = new Pen (Color. Yellow, 2);
Pen pero1 = new Pen (Color. Black, 2);
int k=0;
private void timer2_Tick (object sender, EventArgs e)
{
Graphics f = pictureBox1. CreateGraphics();
if (k == 0)
{
k = 1;
pero1 = new Pen (Color. White, 4);
f. DrawLine (pero1, 85, 240, 125, 200); // первая линия
f. DrawLine (pero1, 125, 200, 185, 170); // 2
f. DrawLine (pero1, 185, 170, 230, 170); // 3
f. DrawLine (pero1, 230, 170, 280, 160); // 4
f. DrawLine (pero1, 280, 160, 295, 120); // 5
f. DrawLine (pero1, 125, 200, 80, 140);
f. DrawLine (pero1, 185, 170, 160, 130);
f. DrawLine (pero1, 160, 130, 155, 90);
SolidBrush mySe1 = new SolidBrush (Color. White);
f. DrawEllipse (pero, 82, 238, 7, 7);
f. FillEllipse (mySe1, 82, 238, 7, 7);
f. DrawEllipse (pero, 123, 197, 5, 5);
f. FillEllipse (mySe1, 123, 197, 5, 5);
f. DrawEllipse (pero, 80, 140, 5, 5);
f. FillEllipse (mySe1, 80, 140, 5, 5);
f. DrawEllipse (pero, 159, 130, 5, 5);
f. FillEllipse (mySe1, 159, 130, 5, 5);
f. DrawEllipse (pero, 154, 90, 6, 6);
f. FillEllipse (mySe1, 154, 90, 6, 6);
f. DrawEllipse (pero, 183, 167, 5, 5);
f. FillEllipse (mySe1, 183, 167, 5, 5);
f. DrawEllipse (pero, 230, 167, 5, 5);
f. FillEllipse (mySe1, 230, 167, 5, 5);
f. DrawEllipse (pero, 279, 157, 5, 5);
f. FillEllipse (mySe1, 279, 157, 5, 5);
f. DrawEllipse (pero, 293, 120, 5, 5);
f. FillEllipse (mySe1, 293, 120, 5, 5);
}
else
if (k== 1)
{
k = 0;
pero = new Pen (Color. Tomato, 4);
f. DrawLine (pero, 85, 240, 125, 200); // первая линия
f. DrawLine (pero, 125, 200, 185, 170); // 2
f. DrawLine (pero, 185, 170, 230, 170); // 3
f. DrawLine (pero, 230, 170, 280, 160); // 4
f. DrawLine (pero, 280, 160, 295, 120); // 5
f. DrawLine (pero, 125, 200, 80, 140);
f. DrawLine (pero, 185, 170, 160, 130);
f. DrawLine (pero, 160, 130, 155, 90);
SolidBrush mySe = new SolidBrush (Color. Tomato);
f. DrawEllipse (pero, 82, 238, 7, 7);
f. FillEllipse (mySe, 82, 238, 7, 7);
f. DrawEllipse (pero, 123, 197, 5, 5);
f. FillEllipse (mySe, 123, 197, 5, 5);
f. DrawEllipse (pero, 80, 140, 5, 5);
f. FillEllipse (mySe, 80, 140, 5, 5);
f. DrawEllipse (pero, 159, 130, 5, 5);
f. FillEllipse (mySe, 159, 130, 5, 5);
f. DrawEllipse (pero, 154, 90, 6, 6);
f. FillEllipse (mySe, 154, 90, 6, 6);
f. DrawEllipse (pero, 183, 167, 5, 5);
f. FillEllipse (mySe, 183, 167, 5, 5);
f. DrawEllipse (pero, 230, 167, 5, 5);
f. FillEllipse (mySe, 230, 167, 5, 5);
f. DrawEllipse (pero, 279, 157, 5, 5);
f. FillEllipse (mySe, 279, 157, 5, 5);
f. DrawEllipse (pero, 293, 120, 5, 5);
f. FillEllipse (mySe, 293, 120, 5, 5);
}
}
}
}
Рисунок 2
Размещено на Allbest.ru
Подобные документы
Таймер в Windows как устройство ввода информации, которое извещает приложение о том, что истек заданный интервал времени. Работа с таймером в условиях WinAPI, процесс 32-битного программирования на ассемблере под Windows. Результат выполнения программы.
курсовая работа [165,6 K], добавлен 18.05.2014Правила создания и особенности работы с приложением Windows Application. Рассмотрение структуры панели Properties и ее функционального назначения. Возможности пункта меню "View". Практическая разработка приложения - калькулятора для сложения двух чисел.
лабораторная работа [99,1 K], добавлен 01.12.2011Операционная система MS-DOS: история и характеристика. Обзор стандартных программ операционной системы Windows. Способы запуска программ. Служебные приложения Windows и их назначение: диспетчер задач, проверка, очистка, дефрагментация и архивация диска.
реферат [221,4 K], добавлен 06.01.2015История создания. Windows 9x/NT. Операционная система Microsoft Windows. Преимущества и недостатки Windows. Некоторые клавиатурные комбинации Windows 9x и NT. Windows XP Professional. Наиболее совершенная защита.
реферат [19,3 K], добавлен 18.07.2004Основные подходы при создании Windows приложений. Изучение навыков работы с 2D графикой в Windows приложениях. Методы генерации псевдослучайных чисел. Разработка игры "Сапер" с расположением мин на основе нескольких методов генерации случайных чисел.
курсовая работа [63,2 K], добавлен 18.02.2009История Windows. Особенности Windows XP. Файловая система и структура. Основные принципы работы с системой. Начало и завершение работы, главное меню. Запуск и завершение программ. Окна и диалоги, панель задач. Установка Windows XP.
курсовая работа [344,0 K], добавлен 24.04.2007Реализация программы, созданной средствами языка C#. Предназначение Windows-приложения для решения комплекса задач. Определение состава форм с графиком функции. Вычисление коэффициентов полинома. Создание текстового поля для введения корней многочлена.
курсовая работа [234,8 K], добавлен 13.11.2016Характеристика операционной системы. История развития Windows. Сравнительная характеристика версий Windows. Элементы и инструменты Windows XP. Прикладные программы в Windows XP. Работа настольных и портативных компьютеров под управлением Windows.
доклад [19,1 K], добавлен 16.10.2011Процессом как экземпляр выполняемой программы, его структура и основные элементы в Windows. Назначение нитей и волокон. Порядок создания и завершения процессов, разработки и уничтожения нитей и волокон. Способы выполнения работы нити, Wait-функции.
реферат [15,7 K], добавлен 14.07.2009Общая характеристика и особенности операционной системы Windows 95, ее сетевые возможности, оценка преимуществ и недостатков. Сравнительная характеристика Windows 95, 98 и Millennium. Принципы работы и устройство принтеров, их части и назначение.
курсовая работа [42,2 K], добавлен 05.03.2010