Векторный редактор изображений

Создание решения, приложения WindowsForms и библиотеки классов. Его модификация: подготовка интерфейса редактора и добавление файлов ресурсов. Создание приложения Windows Forms для рисования в массиве простых объектов на подобии точек и линий, кривых.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 08.04.2017
Размер файла 2,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru//

Размещено на http://www.allbest.ru//

Лабораторная работа № 15: Векторный редактор изображений

1. Вводная часть

В этой работе будет рассмотрена работа с векторной графикой и рисованием в массиве простых объектов на подобии точек и линий, кривых, эллипсов и прямоугольников. Однако, в отличие от предыдущей лабораторной работы практикума, приложение будет способно «запоминать» нарисованный объект -- вести историю рисования. В любой момент можно «выделить» ранее нарисованный объект при помощи мыши и изменить его свойства (толщину, цвет, положение и размер). Мы будем создавать векторный графический редактор.

Конечным итогом редактора в любом случае должно стать некий файл с изображением. Однако, способность формировать BMPили JPEG-файл была работе. Для нашего редактора, сохраняемым типом файлов станет некий собственный тип, «сериализирующий» и сохраняющий все объекты как массив (список) параметров. Фактически такой файл не будет отличаться от того же JPEG (файл это всегда последовательность битов), и будет являться «собственным» графическим форматом. После открытия такого файла, можно изменить параметры ранее нарисованных объектов, а также можно продолжить рисование. приложение рисование векторный редактор

В данной работе будет рассмотрено, как создать приложение Windows Forms для рисования графических объектов в области клиента Windows (непосредственно в специальном пользовательском элементе управления), рисование будет осуществляться с помощью мыши. Инструментами рисования, реализованные в данной работе являются: прямоугольник, эллипс, линия и карандаш. Есть хорошо известные методы создания таких типов приложений, в частности: взаимодействие с мышью (без мерцания при рисовании), осуществления рисования и выделенным инструментом, выделение нарисованных объектов, управление объектами Z-порядка и прочее.

Заходя вперёд скажем, что наше решение будет содержать два проекта: LWP15Draw--Приложение Windows Forms и LWP15Toolkit--Библиотека классов. LWP15Tools реализует функциональность приложения, аLWP15Toolkitсодержит классы для управления документами.

Данная лабораторная работа была создана и переработана, на основе статьи «DrawTools» (Alex Fr, 25 января 2007 года).

2. Создание решения, приложения WindowsForms и библиотеки классов

Запускаем Visual Studio 2010, откроется Начальная страница:

Для начала, надо создать решение, для этого выполним последовательно: Файл ->Создать ->Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N или пункт «Создать проект…» на Начальной странице):

Выберем слева в пункте Установленные шаблоныподпункт Другие типы проектов и далее Решения VisualStudio, далее найдём в списке Новое решение. В поле Имя вводим LWP15. Так будет назваться общая директория под два будущих проекта.

Рис. 2. 1. Создание нового проекта (пустого решения)

Жмём ОК. Теперь у нас есть пустое решение:

Заполним его первым проектом. Выполним последовательно Файл ->Создать ->Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N).

В открывшемся окне выберем слева в пункте Установленные шаблоны язык VisualC#, далее найдём в списке Приложение WindowsForms. Также здесь можно выбрать какой использовать «фреймворк» (набора компонентов для написания программ). В нашем случае выберем .NET Framework 4.

Рис. 2. 2. Окно создания нового проекта (проекта приложения WindowsForms)

В поле Имя вводим LWP15Draw-- это название программы (выбрано по названию лабораторного практикума, номеру и названию работы). В поле Расположение указана конечная директория, где будет находиться весь проект. Выберем расположение удобное для быстрого поиска. В поле решение выбираем из списка Добавить в решение, таким образом объединяя решение и проект.При этом поменяется строка в пункте Расположение (добавится путь к директории решения). В поле Имя решения вводится либо название программы «по умолчанию» из поля Имя автоматически, либо можно ввести своё собственное. Под этим именем будет создана конечная папка проекта (если Имя и Имя решения разные).

Рис. 2. 3. Вводим данные нового проекта приложения WindowsForms

После нажатия клавиши ОК мы увидим сформированный проект и исходный код приложения WindowsForms (не пустого изначально).

И наконец, нужно создать последний проект в решении. Им станет проект типа Библиотека классов с именем LWP15Tools (рис. 2. 4).

Рис. 2. 4. Вводим данные нового проекта библиотеки классов

Рис. 2. 5. Обозреватель решений: состав итогового решения сформированного средой разработки

Выберем также, какой проект считать главным и запускать в режиме отладки. В обозревателе решений нажмём на имя решения (). Перейдём вниз на панель Свойства. Параметр для пункта Запускаемый проект ставим LWP15Draw.

Теперь, можно откомпилировать созданную программу, нажав клавишу F5 (Отладка ->Начать отладку или нажав на иконку. Тем самым мы запускаем приложение в режиме отладки (и производим компиляцию debug-версии программы) (Debug выбрано изначально).

Рис. 2. 5. Запуск приложения WindowsForms по конфигурации Debug(и компиляция всего решения)

3. Модификация приложения WindowsForms: подготовка интерфейса редактора и добавление файлов ресурсов

Так как наша программа будет похожа на редактор изображений, нам необходимы все атрибуты такого редактора. У нас будет верхнее меню для навигации и нижняя строка состояния для отображения подсказок.

Для начала изменим размер нашей единственной формы проекта LWP15Draw. Для этого можно потянуть за уголок в нужном направлении на странице визуального представления формы1. Но также размер можно менять на панели свойств этой формы. Для этого нужно поменять значение размера в пикселях (высоту и ширину) в поле Size.

ПРИМЕЧАНИЕ № 1: Для перехода на визуальное представление формы, необходимо двойным нажатием в обозревателе решений нажать на значок формы () или выбрать вкладку на панели вкладок с именем <имя формы>.cs [Конструктор].

Задаём следующие параметры формы на панели Свойства:

(Name)

изменим с Form1.cs2 на LWP15Main

^ Поменяем внутреннее имя формы.

Text

изменим с Form1 на Векторный графический редактор (C#)

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

Icon

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

Size

изменим со значений 300; 300 на 640; 480

^Поменяем размер формы.

ПРИМЕЧАНИЕ № 2: Для того, чтобы поменять имя файла нашей формы, необходимо выполнить следующее: выделить в обозревателе решений значок формы () и нажать правую кнопку мыши, затем выбрать Переименовать. Ввести необходимое новое имя, СОХРАНЯЯ расширение *.cs. После смены имени, автоматически поменяются имена проассоциированных непосредственно с формой файлов:

Размести на форме (перетаскиванием в любое место) три панели:

ToolStrip ();

MenuStrip ();

StatusStrip ().

Все эти элементы расположены на панели инструментов в разделе Меню ипанели инструментов:

То, что должно получиться в итоге, показано на рисунке ниже:

Рис. 3. 1. Модифицированная форма приложения и расстановка необходимых элементов управления

Главным элементом рисования будет пользовательский элемент управления. Нужно его создать. Выполним последовательно: Проект ->Добавить пользовательский элемент управления...: откроется окно «Добавление нового элемента - LWP15». Нужный элемент для добавления будет уже выбран. Впишем только строчку в поле Имя: DrawArea.cs. Жмём ОК.

Рис. 3. 2. Добавление нового элемента - LWP15Draw:Пользовательский элемент управления

Перейдём к свойствам элемента (одинарное нажатие на DrawArea.csв обозревателе решений). Изменим свойство BackColorна значение White. Получим следующее:

DrawArea.cs

(Name):

DrawArea

BackColor:

White

Наше поле для рисования готово. Добавим его на форму позже. А пока, нам необходимы файлы ресурсов. Ими станут файлы изображений для курсора и панели инструментов.

Начнём с изображений для курсора. Курсоров будет пять. Для создания курсора выполним: Проект ->Добавить новый элемент... (Ctrl+Shift+A). В открывшемся окне ищем Файл курсора.

Рис. 3. 3. Добавление нового элемента -LWP15Draw: Файл курсора

Первый курсор для рисования линий. Имя: C_Line.cur. Вписываем это имя и жмём Добавить. Откроется редактор курсоров. Рисуем нечто подобное:

.

Второй курсор для рисования эллипсов. Имя: C_Ellipse.cur. Рисуем нечто подобное:

Третий курсор для рисования прямоугольников. Имя: C_Rectangle.cur. Рисуем нечто подобное:

Четвёртый курсор для рисования карандашом. Имя: C_Pencil.cur. Рисуем нечто подобное:

Последний курсор для рисования перетаскивания нарисованного карандашом. Имя: C_PolyHandle.cur. Рисуем нечто подобное:

ПРИМЕЧАНИЕ № 3: Очень важно для каждого добавленного курсора (для файла курсора *.curв обозревателе решений ИЗМЕНИТЬ свойство Действие по построению на значение Внедрённый ресурс. Если этого не сделать, могут возникнуть ситуация при которой приложение будет компилироваться, но работать некорректно (будет отсутствовать функциональность рисования).

Рис. 3. 4. Изменение свойства «Действие по построению» для файла курсора (C_Ellipse.cur)

Остались иконки для панели инструментов. Создаём кнопку и сразу же применяем на кнопки иконку и меняем свойства. Для создания кнопки на панели инструментов, нажимаем на toolStrip1, далее на правую кнопку мыши и жмём Вставить стандартные элементы:

Получим следующее:

Снова выделим toolStrip1 и нажмём ПКМ, затем выберем Правка элементов...:

Рис. 3. 5. Редактор коллекции элементов для toolStrip1

Удаляем кнопки печать..., вырезать..., копировать... и вставка... (выделяем элементов слева и жмём крестик ):

Добавляем ещё один разделитель (Separator) и перемещаем его стрелкой вверх на позицию под toolSeparator1:

Добавляем первую кнопку Button(Выделение)под первый разделитель (toolStripSeparator) на панель со следующими свойствами:

(Name):

выделениеToolStripButton

Text:

&Выделение

ToolTipText:

Выделение

Image

Импортируем иконку

Для вставки изображения, выделяем свойство Imageи жмём «...» справа в поле значения:

В открывшемся окне Выбор ресурса, жмём Импорт (Локальный ресурс) и выбираем файл Pointer.pngиз архива Icons.zip (архив можнозагрузитьпоссылкевконцеэтогоматериала). Также, изображение для иконки можно создать в самой среде разработки (открываем Resources.resxв директории Propertiesпроекта LWP15Draw, далее Добавить ресурс ->Создать изображение ->Изображение PNG...).

Добавляем вторую кнопку Button(Карандаш)под первую кнопку на панель со следующими свойствами:

(Name):

карандашToolStripButton

Text:

&Карандаш

ToolTipText:

Карандаш

Image:

Импортируем иконку

Добавляем третью кнопку Button(Линия)под вторую кнопку на панель со следующими свойствами:

(Name):

линияToolStripButton

Text:

&Линия

ToolTipText:

Линия

Image:

Импортируем иконку

Добавляем четвёртую кнопку Button(Эллипс)под предыдущую кнопку на панель со следующими свойствами:

(Name):

эллипсToolStripButton

Text:

&Эллипс

ToolTipText:

Эллипс

Image:

Импортируем иконку

Добавляем пятую кнопку Button(Прямоугольник)под предыдущую кнопку на панель со следующими свойствами:

(Name):

прямоугольникToolStripButton

Text:

&Прямоугольник

ToolTipText:

Прямоугольник

Image:

Импортируем иконку

После разделителя добавим ещё две кнопки. Отменить и Вернуть.

(Name):

отменитьToolStripButton

Text:

&Отменить

ToolTipText:

Отменить

Image:

Импортируем иконку

(Name):

вернутьToolStripButton

Text:

В&ернуть

ToolTipText:

Вернуть

Image:

Импортируем иконку

Итог:

Строка меню (menuStrip1), будет содержать те же команды плюс некоторые новые. Поступаем точно также как и с панелью инструментов. Вначале добавляем на панель стандартные элементы (menuStrip1 ->ПКМ ->Вставить стандартные элементы):

Переименуем через свойства меню Сервис в Рисование (выделим элемент меню и перейдём на свойства элемента):

(Name):

рисованиеToolStripMenuItem

Text:

Р&исование

Для меню Файл итоговые элементы такие:

Удаляем лишние элементы (Печать и Предварительный просмотр) и добавляем новые (Последние файлыи ещё одинSeparator).Редактирование меню можно упросить следующим образом. Выделяем левой кнопкой мыши пункт Файл ->ПКМ ->Правка DropDownItems...:

Рис. 3. 6. Редактируем меню Файлдля menuStrip1

Для меню Правка итоговые элементы такие:

Для меню Рисование итоговые элементы такие:

Иконки добавляются для элемента меню через свойство Image. Импортируем соответствующие иконки для соответствующего пункта меню.

Для меню Справка итоговые элементы такие:

Добавим две формы. Первая форма станет диалоговым окном, вызываемым по кнопке О программе меню Справка. Выполняем Проект ->Добавить форму Windows..., Имя указываем как LWP15About. Жмём Добавить. Меняем свойства формы:

Рис. 3. 7. Добавление нового элемента -LWP15Draw: Форма WindowsForms

(Name)

Должно быть LWP15About

^ Поменяем внутреннее имя формы.

Text

изменим с LWP15About на Векторный графический редактор (C#) :: О программе

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

MaximizeBox

изменим с True на False

^ Уберём кнопку Развернуть.

MinimizeBox

изменим с True на False

^ Уберём кнопку Свернуть.

Icon

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

Size

изменим со значений 300; 300 на 400; 150

^Поменяем размер формы.

FormBorderStyle

изменим с Sizable на FixedDialog

^ Сделаем окно «неизменяем» по размерам.

StartPosition

изменимсWindowsDefaultLocationнаCenterScreen

^ Определим первоначальное положение формы при вызове.

Размести на форме одну кнопку Button и один Labelсо следующими свойствами:

Button

(Name):

B_OK

Text:

Закрыть

Label

(Name):

L_About

Text:

О программе

AutoSize:

False

Size:

250; 65

Вернёмся к свойствам формы и изменим свойство AcceptButtonна B_OK:

В итоге получим следующую форму:

Рис. 3. 8. Форма LWP15About

Вторая форма и последняя форма, которую необходимо добавить, будет выполнять функции диалога выбора параметров рисования. Имя формы: LWP15Properties. Свойства следующие:

(Name)

Должно быть LWP15Properties

^ Поменяем внутреннее имя формы.

Text

изменим с LWP15About на Векторный графический редактор (C#) :: Параметры

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

MaximizeBox

изменим с True на False

^ Уберём кнопку Развернуть.

MinimizeBox

изменим с True на False

^ Уберём кнопку Свернуть.

Icon

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

Size

изменим со значений 300; 300 на 385; 135

^Поменяем размер формы.

FormBorderStyle

изменим с Sizable на FixedDialog

^ Сделаем окно «неизменяем» по размерам.

StartPosition

изменимсWindowsDefaultLocationнаCenterScreen

^ Определим первоначальное положение формы при вызове.

Рис. 3. 9. Форма LWP15Properties

Расставим элементы:

Button

(Name):

B_OK

Text:

Применить

Button

(Name):

B_Cancel

Text:

Отменить

Button

(Name):

B_SelectColor

Text:

...

TextAlign:

MiddleCenter

Label

(Name):

label1

Text:

Текущий цвет:

Label

(Name):

label2

Text:

Толщина пера:

ComboBox

(Name):

CB_PenWodth

DropDownStyle:

DropDownList

Label

(Name):

L_Color

BorderStyle:

Fixed3D

TextAlign:

MiddleCenter

Text:

Label

(Name):

L_PenWidth

BorderStyle:

Fixed3D

TextAlign:

MiddleCenter

Text:

Вернёмся к свойствам формы и изменим свойство AcceptButtonна B_OK и CancelButtonна B_Cancel.

Наконец создаём обычный StatusLabelв строке состояния главной формы LW15Main:

StatusLabel

(Name):

toolStripStatusLabel

Text:

Строка состояния

Приготовления завершены.

Окончательный вид приложения должен быть таким:

Рис. 3. 10. Модифицированная форма приложения и расстановка необходимых элементов управления

4. О будущей функциональности векторного редактора изображений

LWP15Tools:

Библиотека LWP15Tools содержит набор классов, которые могут быть использованы для работы с документами в приложенииWindows Forms. Экземпляры классов, из библиотеки LWP15Tools хранятся на главной форме проекта LWP15Draw и используются для общих операций, связанных с файлом документа.

Библиотека LWP15Toolsбудет состоять из следующих полноценных классов:

Класс DocManager: осуществляет операции, связанные с файлом: открытие, создание, сохранение, обновление названия формы и регистрация типа файлов для оболочки Windows.

Класс DragDropManager: позволяет открывать файлы из проводника Windows в приложенииWindows Forms.

Класс MruManager: список управляет наиболее часто используемыми файлами (Последние файлы в пункте меню Файл).

Класс PersistWindowState: позволяет сохранить последнее состояние окна в реестре и восстановить его при загрузке главной формы.

LWP15Draw:

Структура классов приложения и наследование реализовано следующим образом:

Рис. 4. 1. Классы проекта LWP15Draw

Назначения классов (файлов) следующее:

DrawArea-- пользовательский элемент управления, который заполняет главное окно клиентской области. Содержит экземпляр класса GraphicsList. Рисует графические объекты, обрабатывает ввод от мыши передачей команд в GraphicsList. Реализует графическое пространство в явном виде для интерфейса формы.

GraphicsList-- список графических объектов. Содержит ArrayList графических объектов. «Общается» с графическими объектами в общем виде, с использованием методов DrawObject. Реализует графическое пространство в виртуальном виде приложения.

DrawObject-- абстрактный базовый класс для всех графических объектов.

DrawRectangle--рисование графического объекта прямоугольника.

DrawEllipise--рисование графического объекта эллипса.

DrawLine-- рисование графического объекта линии.

DrawPolygon-- рисование графического объекта непрерывной линии/карандаш.

Tool-- абстрактный базовый класс для всех инструментов рисования.

ToolPointer-- указатель инструмента (нейтральный инструмент). Содержит реализации для выбора, перемещения, изменения размера графических объектов.

ToolObject-- абстрактный базовый класс для всех инструментов, создающих новый графический объект.

ToolRectangle-- реализует инструмент «прямоугольник».

ToolEllipse-- реализует инструмент «эллипс».

ToolLine--реализует инструмент «линия».

ToolPolygon--реализует инструмент «непрерывная линия/карандаш».

Сериализация:

Класс GraphicList реализует интерфейс ISerializable, который позволяет производить двоичной сериализации объекта класса. Класс DrawObject имеет две virtual-функции, используемые для сериализации:

publicvirtualvoidSaveToStream(SerializationInfoinfo, intorderNumber)

{

// ...

}

publicvirtualvoid LoadFromStream(SerializationInfo info, int orderNumber)

{

// ...

}

Эти функции реализованы в каждом производном классе. Двоичный сохранённый файл имеет следующий формат:

Число объектов

Имя типа

Объект

Имя типа

Объект

...

Имя типа

Объект

Это позволяет писать код общий сериализации в классе GraphicList не зная никаких подробностей о сериализованных объектов (абстрактно, для любого объекта):

privateconststring entryCount = "Count";

privateconststring entryType = "Type";

// Сохранитьсписоквпоток

[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]

publicvirtualvoid GetObjectData(SerializationInfo info, StreamingContext context)

{

// Число объектов

info.AddValue(entryCount, graphicsList.Count);

int i = 0;

foreach (DrawObject o in graphicsList)

{

// Типобъекта

info.AddValue(

String.Format(CultureInfo.InvariantCulture,

"{0}{1}",

entryType, i),

o.GetType().FullName);

// Самобъект

o.SaveToStream(info, i);

i++;

}

}

// Загружаемизпотока

protected GraphicsList(SerializationInfo info, StreamingContext context)

{

graphicsList = new ArrayList();

// Числообъектов

int n = info.GetInt32(entryCount);

string typeName;

object drawObject;

for ( int i = 0; i < n; i++ )

{

// Типобъекта

typeName = info.GetString(

String.Format(CultureInfo.InvariantCulture,

"{0}{1}",

entryType, i));

// СоздаёмобъектпоименитипачерезusingReflection)

drawObject = Assembly.GetExecutingAssembly().CreateInstance(

typeName);

// Заполняемобъектизпотока

((DrawObject)drawObject).LoadFromStream(info, i);

graphicsList.Add(drawObject);

}

}

Проверканажатиякнопкимыши:

Как определить, что под указателем мыши находится нарисованный ранее объект?

Класс DrawObjectимеет virtual-функциюHitTest, которая определяет, принадлежит ли точка графическому объекту (проверят, куда нажал пользователь):

publicvirtualint HitTest(Point point)

{

return -1;

}

Производные классы используют virtual PointInObject для проверки нажатия. Эта функция вызывается из HitTest. КлассDrawRectangle реализует эту функцию:

protectedoverridebool PointInObject(Point point)

{

return rectangle.Contains(point);

// rectangle - принадлежиттипу Rectangle

}

Чуть более сложный вариант определения нажатия по линии:

protectedoverridebool PointInObject(Point point)

{

GraphicsPath areaPath;

Pen areaPen;

Region areaRegion;

// Создаём путь, который содержит широкую линию

// Длялёгкоговыборамышью

AreaPath = new GraphicsPath();

AreaPen = newPen(Color.Black, 7);

AreaPath.AddLine(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);

// startPoint и endPoint - принадлежаттипу Point

AreaPath.Widen(AreaPen);

// Создаём область из пути

AreaRegion = newRegion(AreaPath);

return AreaRegion.IsVisible(point);

}

Обработка состояния бездействия приложения:

Каждое Windows Forms приложение в своём составе имеет элементы управления такие как кнопки пунктов меню, кнопки панелей инструментов и прочее. В зависимости от текущей ситуации и команды пользователя, эти элементы управления могут иметь различные состояния: включены/выключены, отмечены/не отмечены, видимые/невидимые и так далее. Действие пользователя может изменить это состояние. Настройка состояний элементов управления в каждом обработчике сообщений вызывать ошибку. Вместо этого, это управлять состояние элемента управления лучше через функции, которые вызываются после каждого действия пользователя. В MFC(VisaulC++)существует функция ON_UPDATE_COMMAND_UI, которая позволяет обновить состояние кнопок панели инструментов во время бездействия приложения. Такая возможность может осуществляться также и в .NET программе.

Рассмотрим ситуацию, когда пользователь нажимает кнопку на панели инструментов (Прямоугольник). Эта кнопка должна активироваться, а ранее активный инструмент должен быть снят. Обработчик сообщений кнопки(Прямоугольник) не изменяет состояние элементов управления формы, он просто сохраняет текущее выделение кнопки в некоторой переменной. Обработчик сообщений Idle активирует инструмент и снимает выделение с неактивного инструмента. Передача изменения состояния кнопок происходит через метод, а не напрямую:

publicvoid SetStateOfControls()

{

// Выбор активного инструмента

tbPointer.Pushed = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);

tbRectangle.Pushed = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);

tbEllipse.Pushed = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);

tbLine.Pushed = (drawArea.ActiveTool == DrawArea.DrawToolType.Line);

tbPolygon.Pushed = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);

menuDrawPointer.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);

menuDrawRectangle.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);

menuDrawEllipse.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);

menuDrawLine.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Line);

menuDrawPolygon.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);

// ...

}

// Инструмент "Прямоугольник" выбран

privatevoid CommandRectangle()

{

drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle;

}

5. Модификация приложения WindowsForms: подготовка библиотеки классов

Проект LWP15Toolsбудет содержать четыре самостоятельных класса.

Для выбора, куда именно вставлять новый класс, выбираем в обозревателе решений проект LWP15Tools:

Для добавления нового файла в проект необходимо выполнить: Проект ->Добавить класс... (Shift+Alt+C). Также аналогично действие можно произвести щёлкнув на имени проекта правой кнопкой мыши, затем Добавить ->Класс...:

В окне Добавление нового элемента - LWP15Tools в поле Имя вводим DocManager.cs. Также добавим в проект добавим ссылку на библиотеку System.Windows.Forms (вкладка .NETокна Добавить ссылку). Для добавления ссылки в обозревателе решений нажмём правую кнопку мыши по пункту Ссылки в проекте LWP15Toolsзатем Добавить ->Добавить ссылку...:

Текст первого файла класса DocManager.cs:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 1 (Библиотека классов LWP15Tools)].

Небольшое замечание. Ранее они уже были даны в предыдущих лабораторных работах, но приводим напоминание...

Обратим внимание на следующий код:

#regionКлассDocManagerData

...

#endregion

Этот код формирует из участков кода файла блоки, которые можно закрыть нажав на «минус» слева от строчи #regionи развернуть нажав «плюс» слева от свёрнутого элемента. Выглядит это так:

Также обратим внимание вот на этот код:

///<summary>

///Открываем документ

///</summary>

///<param name="newFileName">

/// Имя файла документа. Empty - функция выводит OpenFileDialog

///</param>

///<returns></returns>

Это описание, в данном случае для функции. Отображается во время использования функции в любом месте, при наведении мыши на экземпляр самой функции. Например, подсвечиваем функцию из этого класса:

О самом классе. Класс выполняет достаточно много функций связанных с сопровождением файлов приложения (создание нового документа, сохранение и открытие), а также работает с системным реестром (ассоциирует тип файла программы с нашим приложением). Забегая вперёд, можно сказать что для поддержки работы с реестром необходимо Запустить приложение один раз от имени администратора для WindowsVistaи Windows 7 (если включён UACи параметрами для него выставлены по умолчанию). В этом случае всех ключи в реестре будут созданы, и дальнейшая работа приложения с ними будет обеспечена. Основной функцией класса является следующая функция:

///<summary>

///Инициализация

///</summary>

///<paramname="data"></param>

publicDocManager(DocManagerDatadata)

{

Функция инициализирует класс и принимает данные (data) для работы класса.Это данные связанные с типом файлов для приложения, в частности основная инициализация для главной формы LWP15Mainвыглядит так:

privateDocManager docManager;

...

// DocManager

DocManagerData data = newDocManagerData();

data.FormOwner = this;

data.UpdateTitle = true;

data.FileDialogFilter = "Файлы LWP15Draw (*.lwp)|*.lwp|Всефайлы (*.*)|*.*";

data.NewDocName = "New.lwp";

data.RegistryPath = registryPath;

docManager = newDocManager(data);

docManager.RegisterFileType("lwp", "lwpfile", "Файл LWP15Draw");

...

Переходим к следующему классу. Назовём файл для него PersistWindowState.cs. Для работы кода добавим новую ссылку System.Drawing.Код файла такой:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 1 (Библиотека классов LWP15Tools)].

Класс отвечает за работу с окном приложения (сохраняет в реестр размер и положение окна, а также состояние минимизации окна, если приложение было свёрнуто).

Следующий файл класса будет носить имя MruManager.cs (класс MruManager). Класс будет обеспечивать работу со список недавно использованных (последних) файлов. По умолчанию будет отображаться 10 наиболее часто используемых файлов. Число символов в пути и имени не будет превышать 40. Работа списка будет выглядеть примерно так:

Код файла класса следующий: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 1 (Библиотека классов LWP15Tools)].

Последний класс отвечает за открытие файла приложение перетаскиванием из проводника Windows. Имя файла класса: DragDropManager.cs. Код файла следующий:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 1 (Библиотека классов LWP15Tools)].

Таким образом,был сформированфайлбиблиотекиLWP15Tools.dll для приложения (можно откомпилировать). Можно переходить к самому приложению.

6. Модификация приложения WindowsForms: функциональность векторного редактора

Для начала определим все необходимые для работы приложения класса внутри самого приложения.

Первый класс с именем файла DrawObject.csстанет основным классом для рисования любых объектов. На его основе будут созданы классы для рисования конкретных объектов типа линий или прямоугольников. Класс будет содержать все возможные функции, события и свойства, необходимы для работы с графическим объектом. А именно этот класс будет определять функция рисования объекта (Draw), выделения, перемещения, изменения размеров и определения количества ключевых точек. Что такое ключевая точка? Для линии это точки на концах линии, которые «подсвечиваются» небольшими прямоугольниками. Если выделить линию и навести мышь на такую точку, курсор будет изменён (зависит от типа точки и объекта рисования). Нажатие на ключевую точку обеспечивает операцию изменения размеров объекта либо перемещения (зависит от объекта рисования). Любой объект во время выделения мышью подсвечивается ключевыми точками. Например, нарисованный и выделенный прямоугольник имеет 8 ключевых точек:

Код файла DrawObject.cs:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 2 (Файлы классов Draw...)].

Класс GraphicsProperties напрямую связан с дочерней формойLWP15Properties. Обработаем форму LWP15Properties и проинициализируем все необходимые свойства и события.

Откроем код формы (выделим LWP15Properies.cs ->нажмём правую кнопку мыши ->Перейти к коду (F7)). Найдём:

public LWP15Properties()

{

InitializeComponent();

}

Добавим после:

privateGraphicsProperties properties;

privateconststring undefined = "Незадано";

privateconstint maxWidth = 10;

publicGraphicsProperties Properties

{

get { return properties; }

set { properties = value; }

}

В самое начало формы добавим код:

using System.Globalization;

Найдём:

namespace LWP15Draw

{

public partialclassLWP15Properties : Form

{

Изменим на:

namespace LWP15Draw

{

partialclassLWP15Properties : Form

{

Проинициализируем первое событие формы LWP15Properties: Load со следующим кодом:

privatevoid LWP15Properties_Load(object sender, EventArgs e)

{

InitControls();

SetColor();

SetPenWidth();

}

Вспомогательные функции добавим сразу после предыдущего фрагмента кода:

privatevoid InitControls()

{

for (int i = 1; i <= maxWidth; i++)

{

CB_PenWidth.Items.Add(i.ToString(CultureInfo.InvariantCulture));

}

}

privatevoid SetColor()

{

if (properties.Color.HasValue) L_Color.BackColor = properties.Color.Value;

else L_Color.Text = undefined;

}

privatevoid SetPenWidth()

{

if (properties.PenWidth.HasValue)

{

int penWidth = properties.PenWidth.Value;

if (penWidth < 1) penWidth = 1;

if (penWidth > maxWidth) penWidth = maxWidth;

label2.Text = penWidth.ToString(CultureInfo.InvariantCulture);

CB_PenWidth.SelectedIndex = penWidth - 1;

}

else { label2.Text = undefined; }

}

privatevoid ReadValues()

{

if (CB_PenWidth.Text != undefined) { properties.PenWidth = CB_PenWidth.SelectedIndex + 1; }

if (L_Color.Text.Length == 0) { properties.Color = L_Color.BackColor; }

}

Событие SelectedIndexChangedдляComboBoxэтойформы:

privatevoid CB_PenWidth_SelectedIndexChanged(object sender, EventArgs e)

{

int width = CB_PenWidth.SelectedIndex + 1;

L_PenWidth.Text = width.ToString(CultureInfo.InvariantCulture);

}

СобытиеClick нажатия кнопкиB_SelectColor:

privatevoid B_SelectColor_Click(object sender, EventArgs e)

{

ColorDialog dlg = newColorDialog();

dlg.Color = L_Color.BackColor;

if (dlg.ShowDialog(this) == DialogResult.OK)

{

L_Color.BackColor = dlg.Color;

L_Color.Text = "";

}

}

СобытиеClickнажатия кнопкиB_OK:

privatevoid B_OK_Click(object sender, EventArgs e)

{

ReadValues();

this.DialogResult = DialogResult.OK;

}

Форма готова. Если возникнут ошибки, перепроверяем имена элементов управления.

Следующим классом станет класс, отвечающий за работу со списком графических объектов документа. Данный класс будет реализовывать массив всех графических объектов, нарисованных в документе.

Логика работы с объектами после рисования будет такой:

Каждый новый объект помещается вначале Z-порядка (списка расположения «под курсором»). Таким образом, нарисовав в одном и том же месте несколько объектов и нажав инструментов «Выделение» на этом же месте «по умолчанию» будет выделен последний нарисованный объект. Если изменить положение объекта в Z-списке, отправив объект «назад» («Переместить назад»), наверху окажется предыдущий нарисованный объект. Сам же объект, который мы отправили «назад», будет расположен в конце Z-порядка и будет выделен, если удалить из области все другие объекты.

Файл для класса назовём GraphicsList.cs, код файла будет таким:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 3 (Файлы классов Graphics...)].

Игнорируем возникшие ошибки (3 штуки, исправим позже добавлением других классов).

Также добавим вспомогательный класс для передачи параметров: GraphicsProperties(файл GraphicsProperties.cs)со следующим кодом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 3 (Файлы классов Graphics...)].

Добавляем новый класс, являющийся базовым для команд типа «Отменить» и «Вернуть» («Undo» и «Redo»). Имя файла класса будет Command.cs, код файла вставляем следующий:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 4 (Файлы классов Command...)].

Следующий класс (CommandChangeState.cs) станет основным классом для поддержки команд перемещений, изменения размеров и изменения параметров объекта рисования для операций «Отменить» и «Вернуть». Код файла будет следующим:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 4 (Файлы классов Command...)].

Класс CommandAdd(CommandAdd.cs), отвечающий за команду добавления объекта для операций «Отменить» и «Вернуть»: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 4 (Файлы классов Command...)].

Непосредственно реализация команд «Отменить» и «Вернуть» будет выполнена следующим классом UndoManager (файл UndoManager.cs) с кодом:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 5 (Прочие файлы)].

Класс CommandDelete(CommandDelete.cs), отвечающий за команду удаления выделенного объекта для операций «Отменить» и «Вернуть»: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 4 (Файлы классов Command...)].

Класс CommandDeleteAll(CommandDeleteAll.cs), отвечающий за команду удаления всех объектов для операций «Отменить» и «Вернуть»: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 4 (Файлы классов Command...)].

Теперь перейдём к классам, поддерживающим рисование графических объектов. Первый и самый примитивный графический объект это линия. Класс на основе DrawObject: DrawLine (DrawLine.cs) реализует всё необходимое для поддержки рисования объекта линии, выделения нарисованного объекта, изменения положения и перемещения объекта линии. Линия рисуется через два три события (нажатие левой кнопки мыши, перемещения и отжатия левой кнопки мыши). Объект имеет де ключевые точки (точка начала и точка конца линии). Сериализуется в файл путём указания следующих параметров: точка начала и точка конца линии, а также строки записей для сохранения в файле: Startи End. Перемещение линии обеспечивается созданием для линии небольшой линейной области (толщина в 7 пикселей от центра линии). Нажатие левой кнопки мыши в этой области приведёт к выделению объекта и активации возможности перемещение, изменения. Изменение размеров линии осуществляется в ключевых точках.

Код файла для реализации класса:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 2 (Файлы классов Draw...)].

Объект получает параметры из инструмента «Линия» следующим образом:

privatePoint startPoint;

privatePoint endPoint;

public DrawLine(int x1, int y1, int x2, int y2) : base()

{

startPoint.X = x1;

startPoint.Y = y1;

endPoint.X = x2;

endPoint.Y = y2;

Initialize();

}

Рисует линию так:

///<summary>

/// Главная функция рисования линии на форме

///</summary>

publicoverridevoid Draw(Graphics g)

{

g.SmoothingMode = SmoothingMode.AntiAlias;

Pen pen = newPen(Color, PenWidth);

g.DrawLine(pen, startPoint.X, startPoint.Y, endPoint.X, endPoint.Y);

pen.Dispose();

}

Прямоугольник. Класс на основе DrawObject: DrawRectangle (DrawRectangle.cs) реализует всё необходимое для поддержки рисования объекта прямоугольника, выделения нарисованного объекта, изменения положения и перемещения объекта прямоугольника. Объект имеет воесь ключевых точек (угловые точки, точки в центре линий). Сериализуется в файл путём указания следующих параметров: область прямоугольника, а также строки записей для сохранения в файле: Rect. Прямоугольник является цельным объектом, область для перемещения которого ограничена стронами прямоугольника. Для перемещения, как и в случае с линией нужно выделить объект (в любом месте прямоугольника) и зажать левую кнопку мыши.

Код файла для реализации класса:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 2 (Файлы классов Draw...)].

Нормализация нужна для правильного определения направления рисования (первое нажатие в левом уголу, движение мыши в правый нижний угол и прочее) и получение положительных значений координат для прямоугольника.

Эллипс. Класс на основе DrawRectangle: DrawEllipse (DrawEllipse.cs) реализует всё необходимое для поддержки рисования объекта эллипса, выделения нарисованного объекта, изменения положения и перемещения объекта эллипса. Объект имеет весь ключевых точек (угловые точки, точки в центре линий). Сериализуется в файл путём указания следующих параметров: область прямоугольника, а также строки записей для сохранения в файле: Rect. Прямоугольник является цельным объектом, область для перемещения которого ограничена стронами прямоугольника. Для перемещения, как и в случае с линией нужно выделить объект (в любом месте прямоугольника) и зажать левую кнопку мыши.

Код файла для реализации класса:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 2 (Файлы классов Draw...)].

Объект получает следующие параметры из инструмента «Эллипс»:

public DrawEllipse(int x, int y, int width, int height) : base()

{

Rectangle = newRectangle(x, y, width, height);

Initialize();

}

Рисование эллипса реализовано так:

///<summary>

/// Главная функция рисования эллипса на форме

///</summary>

///<param name="g"></param>

publicoverridevoid Draw(Graphics g)

{

Pen pen = newPen(Color, PenWidth);

g.DrawEllipse(pen, DrawRectangle.GetNormalizedRectangle(Rectangle));

pen.Dispose();

}

Карандаш: последний объект рисования. Класс на основе DrawLine: DrawPolygon (DrawPolygon.cs) реализует всё необходимое для поддержки рисования объекта непрерывной линии с малым расстоянием между точками, выделения нарисованного объекта, изменения положения и перемещения объекта карандаша. Объект имеет столько ключевых точек, сколько нарисовано «кусков» + 1 точка). Сериализуется в файл путём указания следующих параметров: точка и длина (для одного участка), а также строки записей для сохранения в файле: Pointи Length. Карандаш не является цельным объектом (даже в случае замыкания линий). Для перемещения, как и в случае с линией нужно выделить объект (в любом месте нарисоанной ломаной) и зажать левую кнопку мыши. Путь для выделения создаётся также как и в случае с линией, но для каждого участка. Параметр расстояния (до ближайшей точки) регулируется так (будущий файл ToolPolygon.cs):

privateconstint minDistance = 15*15; // Дистанция между ключевыми точками

Кусок кода события перемещения мыши во время рисования:

Point point = newPoint(e.X, e.Y);

int distance = (e.X - lastX)*(e.X - lastX) + (e.Y - lastY)*(e.Y - lastY);

if (distance < minDistance)

{

// Если расстояние между последними двумя точками меньше минимального -// перемещаем последнюю точку

newPolygon.MoveHandleTo(point, newPolygon.HandleCount);

}

else

{

// Добавляем новую точку

newPolygon.AddPoint(point);

lastX = e.X;

lastY = e.Y;

}

Код файла для реализации класса:[искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 2 (Файлы классов Draw...)].

Последние 7 классов относятся к классам реализации инструмента рисования, и именно они инициализируются до вызова класса рисования объекта. Экземпляр класса инструмента передаёт в экземпляр класса рисования все параметры. Первый класс из цепочки является абстрактным базовым классом для реализации работы инструментов. Реализует три простых события действия с мышью (нажатие, перемещение и снятие нажатия). Имя: Tool.cs (класс Tool). Код файла с классом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 6 (Файлы классов Tool...)].

ToolObject.cs (класс ToolObject). Это базовый класс для реализации остальных объектов инструментов.Реализует свойства курсора для инструмента, а также функцию добавления нового объекта в список объектов документа:

///<summary>

/// Добавление нового объекта в область рисования.

/// Функция вызывается когда пользователь нажимает ЛКМ на области рисования,

/// и один из полученных ToolObject-инструментов активен.

///</summary>

///<param name="drawArea"></param>

///<param name="o"></param>

protectedvoid AddNewObject(DrawArea drawArea, DrawObject o)

{

drawArea.GraphicsList.UnselectAll();

o.Selected = true;

drawArea.GraphicsList.Add(o);

drawArea.Capture = true;

drawArea.Refresh();

drawArea.SetDirty();

}

Код файла с классом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 6 (Файлы классов Tool...)].

ToolLine.cs (класс ToolLine). Это базовый класс для реализации инструмента рисования «Линия». Передаёт параметры объекту рисования.Реализует свойства курсора для инструмента, а также функцию добавления нового объекта линии в список объектов документа.

Пример события нажатия ЛКМ в области DrawAreaс созданием экземпляра класса DrawLineи передачей параметров нажатия:

publicoverridevoid OnMouseDown(DrawArea drawArea, MouseEventArgs e)

{

AddNewObject(drawArea, newDrawLine(e.X, e.Y, e.X + 1, e.Y + 1));

}

Код файла с классом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 6 (Файлы классов Tool...)].

ToolRectangle.cs (класс ToolRectnagle). Это базовый класс для реализации инструмента рисования «Прямоугольник». Передаёт параметры объекту рисования.Реализует свойства курсора для инструмента, а также функцию добавления нового объекта прямоугольника в список объектов документа. Событие нажатия кнопки мыши:

publicoverridevoid OnMouseDown(DrawArea drawArea, MouseEventArgs e)

{

AddNewObject(drawArea, newDrawRectangle(e.X, e.Y, 1, 1));

}

Код файла с классом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 6 (Файлы классов Tool...)].

ToolEllipse.cs (класс ToolEllipse). Это базовый класс для реализации инструмента рисования «Эллипс». Передаёт параметры объекту рисования.Реализует свойства курсора для инструмента, а также функцию добавления нового объекта эллипса в список объектов документа. Событие нажатия кнопки мыши:

publicoverridevoid OnMouseDown(DrawArea drawArea, MouseEventArgs e)

{

AddNewObject(drawArea, newDrawEllipse(e.X, e.Y, 1, 1));

}

Код файла с классом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 6 (Файлы классов Tool...)].

ToolPolygon.cs (класс ToolPolygon). Это базовый класс для реализации инструмента рисования «Карандаш». Передаёт параметры объекту рисования.Реализует свойства курсора для инструмента, а также функцию добавления нового объекта непрерывной линии в список объектов документ.

Код файла с классом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 6 (Файлы классов Tool...)].

ToolPointer.cs (класс ToolPointer). Это базовый класс для реализации инструмента рисования «Выделение». Передаёт параметры объекту рисования.Реализует события связанные с выделение объектов в области рисования, работает с перемещением объекта, изменением размеров объекта и чистым выделением объект(-ов). Этот инструмент также управляет пунктирным прямоугольником выделения:

if (selectMode == SelectionMode.NetSelection)

{

// Удаляем прямоугольник предыдущего выделения

ControlPaint.DrawReversibleFrame(

drawArea.RectangleToScreen(DrawRectangle.GetNormalizedRectangle(startPoint, oldPoint)),

Color.Black,

FrameStyle.Dashed);

// Рисуем прямоугольник нового выделения

ControlPaint.DrawReversibleFrame(

drawArea.RectangleToScreen(DrawRectangle.GetNormalizedRectangle(startPoint, point)),

Color.Black,

FrameStyle.Dashed);

return;

}

Код файла с классом: [искомый код можно найти в приложении к данной лабораторной работе в (описания можно того или иного приложения можно посмотреть в пунтке № 8 протокола работы), а именно необходимо открыть Приложение № 6 (Файлы классов Tool...)].

На этом формирование классов закончено. Теперь можно перейти к реализации функциональности непосредственно для главной формы и элемента, в котором будем рисовать (DrawArea).

Первым делом «добьём» форму LWP15About. Событие Loadдля формы будет таким:

privatevoid LWP15About_Load(object sender, EventArgs e)

{

this.Text = "Опрограмме " + Application.ProductName;

L_About.Text =

"Программа: " + Application.ProductName + "\n" +

"Версия: " + Application.ProductVersion;

}

СобытиеClickкнопкиB_O...


Подобные документы

  • Общая характеристика интерфейса языка программирования Delphi. Рассмотрение окна редактора кода, конструктора формы, инспектора объектов и расширения файлов. Ознакомление с основными этапами создания и сохранения простого приложения; проверка его работы.

    презентация [184,3 K], добавлен 18.03.2014

  • Дизайн интерфейса приложения как связь человека и персонального компьютера. Adobe Photoshop и его возможности, анализ функциональности и содержание главных операций. Используемые инструменты для разработки дизайна интерфейса текстового редактора.

    контрольная работа [407,5 K], добавлен 12.10.2015

  • Функции графического редактора Paint. Сохранение документов, вставка, перемещение, копирование, удаление. Многократное увеличение или уменьшение инструмента. Полная палитра, выбор третьего цвета для рисования, пипетка, заливка, пользовательская кисть.

    контрольная работа [22,3 K], добавлен 27.07.2009

  • Диаграмма консольного приложения табулирования функции. Отличие консольного приложения и приложения и GUI. Диаграмма классов для JFrameи JPanel. Создание простейшего фрейма в Java. Компоновка элементов интерфейса внутри фрейма. Цикл обработки событий.

    лекция [693,8 K], добавлен 01.05.2014

  • Общая информация о графическом формате. Описание формата Microsoft Windows Bitmap. Структура файла DDВ исходного формата ВМР. Преобразования графических файлов. Просмотр и редактирование растровых изображений. Создание многодокументного приложения.

    дипломная работа [1,5 M], добавлен 06.06.2010

  • Растровые и векторные графические редакторы. Форматы файлов, используемые для хранения графических изображений. Графические редакторы, используемые для создания изображений. Редакторы для создания трехмерных изображений. Создание графического редактора.

    курсовая работа [306,5 K], добавлен 23.08.2013

  • Настройка текстового редактора MS Word. Создание текстового документа. Создание шаблона. Форматирование сложного документа. Создание списков и колонок текста. Создание таблиц. Создание формул. Связывание и внедрение объектов. Создание макросов.

    контрольная работа [36,6 K], добавлен 10.05.2004

  • Характеристика объекта автоматизации. Создание многоуровневой архитектуры приложения, отладка метода безошибочной идентификации пользователей системы. Разработка нестандартного метода преобразования объектов базы данных в объекты классов приложения.

    курсовая работа [395,4 K], добавлен 28.04.2015

  • Определение ресурсов до начала работы программы, их добавление в исполняемый файл. Возможность использования атрибутов в качестве ресурсов, их создание программистом в программе. Применение символьных строк в приложениях. Основные виды меню приложения.

    реферат [32,2 K], добавлен 03.10.2010

  • Основы организации приложения в Windows. Посылка и передача сообщений для окон. Создание и отображение главного окна приложения. Деактивация приложения, его фазы. Сообщения клавиатуры и функции для работы с ней. Определение состояния отдельных клавиш.

    лекция [65,7 K], добавлен 24.06.2009

  • Изучение основных алгоритмов генерации различных видов фракталов. Выбор языка и среды программирования. Характеристика структурных элементов растрового графического редактора фракталов. Описание интерфейса приложения, порядок редактирования изображений.

    курсовая работа [1,2 M], добавлен 04.04.2014

  • Теоретические основы разработки Windows-приложений с использованием библиотеки MFC. Создание приложения с помощью Visual C++. Описание логической структуры приложения. Установка и запуск программы. Входные и выходные данные. Преимущество MFC библиотек.

    курсовая работа [563,2 K], добавлен 21.06.2011

  • Создание Win-приложения для библиотеки, которое позволяло бы осуществлять операции выдачи и сдачи книг в соответствии со сроками. Выбор программных и технических средств реализации проекта. Разработка интерфейса системы, описание реализованных классов.

    курсовая работа [3,1 M], добавлен 14.08.2015

  • Создание приложения для просмотра графических файлов. Компоненты, объекты и операторы для отображения графической информации в библиотеке Delphi. Канва как область компонента для рисования и отображения изображений. Рисование пером, закрашивание кистью.

    методичка [98,1 K], добавлен 19.06.2011

  • Программирование приложения с использованием библиотеки OpenGL и функции для рисования геометрических объектов. Разработка процедуры визуализации трехмерной сцены и интерфейса пользователя. Логическая структура и функциональная декомпозиция проекта.

    курсовая работа [1,1 M], добавлен 23.06.2011

  • Создание изображений при помощи набора графических примитивов (отрезки прямых, прямоугольники, треугольники, эллипсы) и алглритмы зеркального преобразования пространства. Изучение теоретических основ векторной графики, среды программирования С++ Builder.

    курсовая работа [338,9 K], добавлен 02.03.2010

  • Загрузка операционной системы Windows. Набор стандартных приложений, индикатор системных ресурсов и преобразование диска. Необходимость упаковщиков и функция "Архивация", таблица символов, графический редактор Paint и текстовый редактор WordPad.

    контрольная работа [355,9 K], добавлен 18.04.2009

  • Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.

    курсовая работа [1,3 M], добавлен 28.07.2013

  • Требования к программе или программному изделию, к информационной и программной совместимости. Проектирование программного продукта. Процедура установки и удаления. Описание интерфейса, главное окно приложения. Основные возможности пользователя.

    курсовая работа [678,1 K], добавлен 15.02.2016

  • Сущность, задачи и особенности объектно-ориентированного программирования. Создание и редактирование графических файлов при помощи различных инструментов рисования. Основные требования к аппаратному и программному обеспечению. Руководство пользователя.

    курсовая работа [270,9 K], добавлен 09.03.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.