Векторный редактор изображений
Создание решения, приложения WindowsForms и библиотеки классов. Его модификация: подготовка интерфейса редактора и добавление файлов ресурсов. Создание приложения Windows Forms для рисования в массиве простых объектов на подобии точек и линий, кривых.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 08.04.2017 |
Размер файла | 2,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
///<param name="docManager"></param>
publicvoid Initialize(LWP15Main owner, DocManager docManager)
{
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
// Сохраняем ссылку на владельца формы
this.Owner = owner;
this.DocManager = docManager;
// Устанавливаем инструмент по умолчанию
activeTool = DrawToolType.Pointer;
// Создаём список графических объектов
graphicsList = newGraphicsList();
// Создаём экземпляр UndoManager для текущего файла
undoManager = newUndoManager(graphicsList);
// Создаём массив инструментов рисования
tools = newTool[(int)DrawToolType.NumberOfDrawTools];
tools[(int)DrawToolType.Pointer] = newToolPointer();
tools[(int)DrawToolType.Rectangle] = newToolRectangle();
tools[(int)DrawToolType.Ellipse] = newToolEllipse();
tools[(int)DrawToolType.Line] = newToolLine();
tools[(int)DrawToolType.Polygon] = newToolPolygon();
}
///<summary>
/// Добавления команды в историю
///</summary>
publicvoid AddCommandToHistory(Command command)
{
undoManager.AddCommandToHistory(command);
}
///<summary>
///Очистка истории
///</summary>
publicvoid ClearHistory()
{
undoManager.ClearHistory();
}
///<summary>
///Отменить
///</summary>
publicvoid Undo()
{
undoManager.Undo();
Refresh();
}
///<summary>
///Вернуть
///</summary>
publicvoid Redo()
{
undoManager.Redo();
Refresh();
}
///<summary>
/// Устанавливаем флаг "грязный" (файл был изменён после последней операции сохранения)
///</summary>
publicvoid SetDirty()
{
DocManager.Dirty = true;
}
///<summary>
/// Обработчик нажатия правой кнопки мышки
///</summary>
///<param name="e"></param>
privatevoid OnContextMenu(MouseEventArgs e)
{
// Измененяем текущий выбор при необходимости
Point point = newPoint(e.X, e.Y);
int n = GraphicsList.Count;
DrawObject o = null;
for (int i = 0; i < n; i++)
{
if (GraphicsList[i].HitTest(point) == 0)
{
o = GraphicsList[i];
break;
}
}
if (o != null)
{
if (!o.Selected) GraphicsList.UnselectAll();
// Выбор объекта произведён
o.Selected = true;
}
else
{
GraphicsList.UnselectAll();
}
Refresh(); // В случае изменения выбора
// Выводин контекстное меню (всплывающее).
// Элементы меню вставлены из строки меня, главного элемента "Правка"
m_ContextMenu = newContextMenuStrip();
int nItems = owner.ContextParent.DropDownItems.Count;
// Получаем элементы меню "Правка" и перемещаем их на контекстное-всплывающее меню.
// Так как каждый шаг уменьшает количество элементов, читая их в обратном порядке.
// Чтобы получить элементы в прямом порядке, вставим каждый из них в начало
for (int i = nItems - 1; i >= 0; i--)
{
m_ContextMenu.Items.Insert(0, owner.ContextParent.DropDownItems[i]);
}
// Выводит контекстное меню для владельца формы, а также обрабатывает элементы выбора.
// Преобразует координаты точки в этом окне к координатам владельца
point.X += this.Left;
point.Y += this.Top;
m_ContextMenu.Show(owner, point);
Owner.SetStateOfControls(); // Включение/выключение элементов меню
// Контекстное меню вызвано, но меню "Правка" владельца теперь пусто.
// Подписываемся на событие закрытия контекстного меню и восстанавливаем там элементы
m_ContextMenu.Closed += delegate(object sender, ToolStripDropDownClosedEventArgs args)
{
if (m_ContextMenu != null)
{
nItems = m_ContextMenu.Items.Count;
for (int k = nItems - 1; k >= 0; k--) { owner.ContextParent.DropDownItems.Insert(0, m_ContextMenu.Items[k]); }
}
};
}
#endregion
}
По очереди инициализируем для элемента DrawAreaследующие события с кодом. Вначале идёт событие Paint:
#region Обработчики событий
///<summary>
/// Рисование графического объекта и группировка прямоугольника выделения (опционально)
///</summary>
privatevoid DrawArea_Paint(object sender, PaintEventArgs e)
{
SolidBrush brush = newSolidBrush(Color.FromArgb(255, 255, 255));
e.Graphics.FillRectangle(brush, this.ClientRectangle);
if (graphicsList != null) { graphicsList.Draw(e.Graphics); }
//DrawNetSelection(e.Graphics);
brush.Dispose();
}
СобытиеMouseDown, MouseMoveиMouseUpдляDrawArea:
///<summary>
/// Событие MouseDown для DrawArea
/// ЛКМ: перехватывается активным инструментом
/// ПКМ: перехватывается и описано в данном классе
///</summary>
privatevoid DrawArea_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) tools[(int)activeTool].OnMouseDown(this, e);
elseif (e.Button == MouseButtons.Right) OnContextMenu(e);
}
///<summary>
/// Событие MouseMove для DrawArea
/// Перемещение без нажатия кнопок или с нажатие левой кнопки мыши перехватывается активным инструментом
///</summary>
privatevoid DrawArea_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left || e.Button == MouseButtons.None) tools[(int)activeTool].OnMouseMove(this, e);
elsethis.Cursor = Cursors.Default;
}
///<summary>
/// Событие MouseUp для DrawArea
/// ЛКМ: перехватывается активным инструментом
///</summary>
privatevoid DrawArea_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) tools[(int)activeTool].OnMouseUp(this, e);
}
#endregion
Переходим к главной форме LWP15Main. Переписываем директивы using:
#regionДирективыUsing
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization;
using System.Diagnostics;
using System.Security;
using Microsoft.Win32;
using LWP15Tools;
#endregion
Находим:
publicpartialclassLWP15Main : Form
{
Заменяем на:
partialclassLWP15Main : Form
{
#regionЧлены
privateDrawArea drawArea;
privateDocManager docManager;
privateDragDropManager dragDropManager;
privateMruManager mruManager;
privatePersistWindowState persistState;
privatestring argumentFile = ""; // Имяфайлаизкоманднойстроки
conststring registryPath = "Software\\LWP15Draw";
#endregion
#regionСвойства
///<summary>
///Имяфайлаизкоманднойстроки
///</summary>
publicstring ArgumentFile
{
get { return argumentFile; }
set { argumentFile = value; }
}
///<summary>
///Получаем ссылку на элемент строки меню"Правка".
/// Используется при вызове контекстного-всплывающего меню в классе DrawArea
///</summary>
///<value></value>
publicToolStripMenuItem ContextParent
{
get { returnправкаToolStripMenuItem; }
}
#endregion
#regionКонструктор
public LWP15Main()
{
InitializeComponent();
persistState = newPersistWindowState(registryPath, this);
}
#endregion
#regionОбработчики событий для DocManager
///<summary>
/// Загрузка документа из потока поставляемая DocManager
///</summary>
///<param name="sender"></param>
///<param name="args"></param>
privatevoid docManager_LoadEvent(object sender, SerializationEventArgs e)
{
// DocManager просит загрузить документ в поставляемый поток
try
{
drawArea.GraphicsList = (GraphicsList)e.Formatter.Deserialize(e.SerializationStream);
}
catch (ArgumentNullException ex) { HandleLoadException(ex, e); }
catch (SerializationException ex) { HandleLoadException(ex, e); }
catch (SecurityException ex) { HandleLoadException(ex, e); }
}
///<summary>
/// Сохранение документа в поток поставляемый DocManager
///</summary>
///<param name="sender"></param>
///<param name="args"></param>
privatevoid docManager_SaveEvent(object sender, SerializationEventArgs e)
{
// DocManager просит сохранить документ в поставляемый поток
try
{
e.Formatter.Serialize(e.SerializationStream, drawArea.GraphicsList);
}
catch (ArgumentNullException ex) { HandleSaveException(ex, e); }
catch (SerializationException ex) { HandleSaveException(ex, e); }
catch (SecurityException ex) { HandleSaveException(ex, e); }
}
#endregion
Теперь поочерёдно создаём события строки меню (двойное нажатие на элементе меню для инициализации события Click). В качестве кнопок будут выступать все подпункты (дочерние пункты) меню кроме подпункта «Последние файлы» меню «Файл». Блок с кодом событий Clickвсей строки меню будет таким:
#regionОбработчикисобытийстрокименю
privatevoidсоздатьToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandNew();
}
privatevoidоткрытьToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandOpen();
}
privatevoidсохранитьToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandSave();
}
privatevoidсохранитькакToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandSaveAs();
}
privatevoidвыходToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
privatevoidотменитьToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandUndo();
}
privatevoidвернутьToolStripMenuItem1_Click(object sender, EventArgs e)
{
CommandRedo();
}
Privatevoid выделить все ToolStripMenuItem_Click(object sender, EventArgs e)
{
drawArea.GraphicsList.SelectAll();
drawArea.Refresh();
}
Privatevoid снять Выделение ToolStripMenuItem_Click(object sender, EventArgs e)
{
drawArea.GraphicsList.UnselectAll();
drawArea.Refresh();
}
privatevoidудалитьToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandDelete command = newCommandDelete(drawArea.GraphicsList);
if (drawArea.GraphicsList.DeleteSelection())
{
drawArea.SetDirty();
drawArea.Refresh();
drawArea.AddCommandToHistory(command);
}
}
privatevoidудалитьВсеToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandDeleteAll command = newCommandDeleteAll(drawArea.GraphicsList);
if (drawArea.GraphicsList.Clear())
{
drawArea.SetDirty();
drawArea.Refresh();
drawArea.AddCommandToHistory(command);
}
}
privatevoidпереместитьНазадToolStripMenuItem_Click(object sender, EventArgs e)
{
if (drawArea.GraphicsList.MoveSelectionToBack())
{
drawArea.SetDirty();
drawArea.Refresh();
}
}
privatevoidпереместитьВпередToolStripMenuItem_Click(object sender, EventArgs e)
{
if (drawArea.GraphicsList.MoveSelectionToFront())
{
drawArea.SetDirty();
drawArea.Refresh();
}
}
privatevoidпараметрыToolStripMenuItem_Click(object sender, EventArgs e)
{
if (drawArea.GraphicsList.ShowPropertiesDialog(drawArea))
{
drawArea.SetDirty();
drawArea.Refresh();
}
}
Privatevoid выделениеToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandPointer();
}
privatevoidкарандашToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandPolygon();
}
privatevoidлинияToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandLine();
}
privatevoidэллипсToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandEllipse();
}
privatevoidпрямоугольникToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandRectnagle();
}
Privatevoid о программе ToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandAbout();
}
#endregion
Тожесамое проделываем для строки с иконками (панелью инструментов). Двойное нажатие на иконку инициализирует событие Click:
#region Обработчики событий панели инструментов
privatevoidсоздатьToolStripButton_Click(object sender, EventArgs e)
{
CommandNew();
}
privatevoidоткрытьToolStripButton_Click(object sender, EventArgs e)
{
CommandOpen();
}
privatevoidсохранитьToolStripButton_Click(object sender, EventArgs e)
{
CommandSave();
}
privatevoidвыделениеToolStripButton_Click(object sender, EventArgs e)
{
CommandPointer();
}
privatevoidкарандашToolStripButton_Click(object sender, EventArgs e)
{
CommandPolygon();
}
privatevoidлинияToolStripButton_Click(object sender, EventArgs e)
{
CommandLine();
}
privatevoidэллипсToolStripButton_Click(object sender, EventArgs e)
{
CommandEllipse();
}
privatevoidпрямоугольникToolStripButton_Click(object sender, EventArgs e)
{
CommandRectangle();
}
privatevoidотменитьToolStripButton_Click(object sender, EventArgs e)
{
CommandUndo();
}
privatevoidвернутьToolStripButton_Click(object sender, EventArgs e)
{
CommandRedo();
}
privatevoidсправкаToolStripButton_Click(object sender, EventArgs e)
{
CommandAbout();
}
#endregion
Инициализируем три события для главной формы. Событие Loadформы LWP15Main:
#regionОбработчики событий
privatevoid LWP15Main_Load(object sender, EventArgs e)
{
toolStripStatusLabel.Text = "Готовкработе";
// Создаёмобластьрисования
drawArea = newDrawArea();
drawArea.Location = new System.Drawing.Point(0, 0);
drawArea.Size = new System.Drawing.Size(10, 10);
drawArea.Owner = this;
this.Controls.Add(drawArea);
// Вспомогательные объекты (DocManager и прочие)
InitializeHelperObjects();
drawArea.Initialize(this, docManager);
ResizeDrawArea();
LoadSettingsFromRegistry();
// Submit to Idle event to set controls state at idle time
Application.Idle += delegate(object o, EventArgs a)
{
SetStateOfControls();
};
// Открытый файл передаётся в командную строку
if (ArgumentFile.Length > 0) OpenDocument(ArgumentFile);
// Подписываемся на событие DropDownOpened для каждого всплывающего меню
foreach (ToolStripItem item in menuStrip1.Items)
{
if (item.GetType() == typeof(ToolStripMenuItem)) { ((ToolStripMenuItem)item).DropDownOpened += LWP15Main_DropDownOpened; }
}
}
Событие Resize:
///<summary>
/// Изменение размеров DrawArea, Когда меняются размеры формы
///</summary>
privatevoid LWP15Main_Resize(object sender, EventArgs e)
{
if (this.WindowState != FormWindowState.Minimized && drawArea != null) { ResizeDrawArea(); }
}
Событие FormClosing:
///<summary>
/// Событие закрытия формы
///</summary>
privatevoid LWP15Main_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
if (!docManager.CloseDocument()) e.Cancel = true;
}
SaveSettingsToRegistry();
}
Последнее событие формы без инициализации (просто вставляем код после последнего события):
///<summary>
/// Всплывающая строка меню ("Файл", "Правка" и прочее) открыто
///</summary>
///<param name="sender"></param>
///<param name="e"></param>
void LWP15Main_DropDownOpened(object sender, EventArgs e)
{
// Устанавливаем активный инструмент на "Выделение".
// Педотвращает редкий сбой, когда выбран иной инструмент, пользователь открывает главное менюuser opens
// и после нажатия в DrawArea событие MouseDown не вызывается и MouseMove работает неправильно
drawArea.ActiveTool = DrawArea.DrawToolType.Pointer;
}
#endregion
Наконец добавляем последний участок кода сразу же после предыдущего:
#region Прочие функции
///<summary>
/// Установка состояния элементов управления.
/// Функция вызывается при простое
///</summary>
publicvoid SetStateOfControls()
{
// Выбор активного инструмента
выделениеToolStripButton.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);
прямоугольникToolStripButton.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);
эллипсToolStripButton.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);
линияToolStripButton.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Line);
карандашToolStripButton.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);
выделениеToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);
прямоугольникToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);
эллипсToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);
линияToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Line);
карандашToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);
bool objects = (drawArea.GraphicsList.Count > 0);
bool selectedObjects = (drawArea.GraphicsList.SelectionCount > 0);
// Операции с файлом
сохранитьToolStripMenuItem.Enabled = objects;
сохранитьToolStripButton.Enabled = objects;
сохранитьКакToolStripMenuItem.Enabled = objects;
// Операцииправки
удалитьToolStripMenuItem.Enabled = selectedObjects;
удалитьВсеToolStripMenuItem.Enabled = objects;
выделитьВсеToolStripMenuItem.Enabled = objects;
снятьВыделениеToolStripMenuItem.Enabled = objects;
переместитьВпередToolStripMenuItem.Enabled = selectedObjects;
переместитьНазадToolStripMenuItem.Enabled = selectedObjects;
параметрыToolStripMenuItem.Enabled = selectedObjects;
// "Отменить"
отменитьToolStripMenuItem.Enabled = drawArea.CanUndo;
отменитьToolStripButton.Enabled = drawArea.CanUndo;
// "Вернуть"
вернутьToolStripMenuItem.Enabled = drawArea.CanRedo;
вернутьToolStripButton.Enabled = drawArea.CanRedo;
}
///<summary>
/// Установка области рисования формы на основе пространство свободной области,
/// за исключением панели инструментов, строки состояния и строки меню
///</summary>
privatevoid ResizeDrawArea()
{
Rectangle rect = this.ClientRectangle;
drawArea.Left = rect.Left;
drawArea.Top = rect.Top + menuStrip1.Height + toolStrip1.Height;
drawArea.Width = rect.Width;
drawArea.Height = rect.Height - menuStrip1.Height - toolStrip1.Height - statusStrip1.Height;
}
///<summary>
/// Инициализация вспомогательных объектов из библиотеки классов LWP15Tools.
///</summary>
privatevoid InitializeHelperObjects()
{
// 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");
// Подписываемсянасобытиякласса DocManager
docManager.SaveEvent += docManager_SaveEvent;
docManager.LoadEvent += docManager_LoadEvent;
// Делаем "встроенные подписки" с помощью анонимных методов
docManager.OpenEvent += delegate(object sender, OpenFileEventArgs e)
{
// Обновляемсписокпоследнихфайлов
if (e.Succeeded) mruManager.Add(e.FileName);
else mruManager.Remove(e.FileName);
};
docManager.DocChangedEvent += delegate(object o, EventArgs e)
{
try
{
drawArea.Refresh();
drawArea.ClearHistory();
}
catch { }
};
docManager.ClearEvent += delegate(object o, EventArgs e)
{
if (drawArea.GraphicsList != null)
{
drawArea.GraphicsList.Clear();
drawArea.ClearHistory();
drawArea.Refresh();
}
};
docManager.NewDocument();
// DragDropManager
dragDropManager = newDragDropManager(this);
dragDropManager.FileDroppedEvent += delegate(object sender, FileDroppedEventArgs e)
{
OpenDocument(e.FileArray.GetValue(0).ToString());
};
// MruManager
mruManager = newMruManager();
mruManager.Initialize(
this, // Владелец формы (this)
последниеФайлыToolStripMenuItem, // Элемент меню последних исользованных файлов
файлToolStripMenuItem, // Родительский элемент ("Файл")
registryPath); // Путь в системном реестре для хранения списка последних файлов
mruManager.MruOpenEvent += delegate(object sender, MruFileOpenEventArgs e)
{
OpenDocument(e.FileName);
};
}
///<summary>
///Обрабатываемисключениеизфункции docManager_LoadEvent
///</summary>
///<param name="ex"></param>
///<param name="fileName"></param>
privatevoid HandleLoadException(Exception ex, SerializationEventArgs e)
{
MessageBox.Show(this,
"Операция открытия файла завершилась неудачей. Имяфайла: " + e.FileName + "\n" +
"Причина: " + ex.Message,
Application.ProductName);
e.Error = true;
}
///<summary>
///Обрабатываемисключениеизфункции docManager_SaveEvent
///</summary>
///<param name="ex"></param>
///<param name="fileName"></param>
privatevoid HandleSaveException(Exception ex, SerializationEventArgs e)
{
MessageBox.Show(this,
"Операция сохранения файла завершилась неудачей. Имяфайла: " + e.FileName + "\n" +
"Причина: " + ex.Message,
Application.ProductName);
e.Error = true;
}
///<summary>
/// Открытие документа.
/// Используется для открытия файла переданного в командной строке или "переброшенного" в окно
///</summary>
///<param name="file"></param>
publicvoid OpenDocument(string file)
{
docManager.OpenDocument(file);
}
///<summary>
///Загрузканастроекприложенияизсистемногореестра
///</summary>
void LoadSettingsFromRegistry()
{
try
{
RegistryKey key = Registry.CurrentUser.CreateSubKey(registryPath);
DrawObject.LastUsedColor = Color.FromArgb((int)key.GetValue("Color", Color.Black.ToArgb()));
DrawObject.LastUsedPenWidth = (int)key.GetValue("Width", 1);
}
catch (ArgumentNullException ex) { HandleRegistryException(ex); }
catch (SecurityException ex) { HandleRegistryException(ex); }
catch (ArgumentException ex) { HandleRegistryException(ex); }
catch (ObjectDisposedException ex) { HandleRegistryException(ex); }
catch (UnauthorizedAccessException ex) { HandleRegistryException(ex); }
}
///<summary>
/// Сохранение настроек приложения в системный реестр
///</summary>
void SaveSettingsToRegistry()
{
try
{
RegistryKey key = Registry.CurrentUser.CreateSubKey(registryPath);
key.SetValue("Color", DrawObject.LastUsedColor.ToArgb());
key.SetValue("Width", DrawObject.LastUsedPenWidth);
}
catch (SecurityException ex) { HandleRegistryException(ex); }
catch (ArgumentException ex) { HandleRegistryException(ex); }
catch (ObjectDisposedException ex) { HandleRegistryException(ex); }
catch (UnauthorizedAccessException ex) { HandleRegistryException(ex); }
}
privatevoid HandleRegistryException(Exception ex)
{
Trace.WriteLine("Выполнение операции с системны реестром завершилась неудачей: " + ex.Message);
}
///<summary>
///Выделение
///</summary>
privatevoid CommandPointer()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Pointer;
toolStripStatusLabel.Text = "Выбран инструмент \"Выделение\"";
}
///<summary>
///Прямоугольник
///</summary>
privatevoid CommandRectangle()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle;
toolStripStatusLabel.Text = "Выбранинструмент \"Прямоугольник\"";
}
///<summary>
///Эллипс
///</summary>
privatevoid CommandEllipse()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Ellipse;
toolStripStatusLabel.Text = "Выбранинструмент \"Эллипс\"";
}
///<summary>
///Линия
///</summary>
privatevoid CommandLine()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Line;
toolStripStatusLabel.Text = "Выбранинструмент \"Линия\"";
}
///<summary>
///Карандаш
///</summary>
privatevoid CommandPolygon()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Polygon;
toolStripStatusLabel.Text = "Выбранинструмент \"Карандаш\"";
}
///<summary>
/// Диалог "О программе..."
///</summary>
privatevoid CommandAbout()
{
LWP15About frm = newLWP15About();
frm.ShowDialog(this);
toolStripStatusLabel.Text = "Вызванаформа \"Опрограмме\"";
}
///<summary>
///Создать
///</summary>
privatevoid CommandNew()
{
docManager.NewDocument();
toolStripStatusLabel.Text = "Созданновыйдокумент";
}
///<summary>
///Открыть
///</summary>
privatevoid CommandOpen()
{
docManager.OpenDocument("");
toolStripStatusLabel.Text = "Документоткрыт";
}
///<summary>
///Сохранить
///</summary>
privatevoid CommandSave()
{
docManager.SaveDocument(DocManager.SaveType.Save);
toolStripStatusLabel.Text = "Документсохранён";
}
///<summary>
///Сохранитькак
///</summary>
privatevoid CommandSaveAs()
{
docManager.SaveDocument(DocManager.SaveType.SaveAs);
toolStripStatusLabel.Text = "Документсохранён";
}
///<summary>
///Отменить
///</summary>
privatevoid CommandUndo()
{
drawArea.Undo();
toolStripStatusLabel.Text = "Произведенаоперация \"Отменить\"";
}
///<summary>
///Вернуть
///</summary>
privatevoid CommandRedo()
{
drawArea.Redo();
toolStripStatusLabel.Text = "Произведенаоперация \"Вернуть\"";
}
#endregion
Почти всё. Наше приложение способно создавать свои собственные документы (файлы *.lwp). А как быть, если необходимо сохранить рисунок в нормальном графическом формате? Всё достаточно просто. Нужно сохранить содержимое элемента управления DrawAreaв одно из желаемых форматов растрового изображения.
Для реализации этой функции создаём в меню «Файл» новую кнопку «Сохранить как изображение...»:
Свойства такие:
(Name): |
сохранитьКакИзображениеToolStripMenuItem |
|
Text: |
Сохранить как &изображение... |
|
Image: |
Импортируем иконку |
Событие Clickпо кнопке меню «Сохранить как изображение...»:
#region Добавленная функция экспорта DrawArea в изображение
privateRectangle drawAreaRect;
privatestring fileName;
privatestring strFilExtn;
privatevoidсохранитьКакИзображениеToolStripMenuItem_Click(object sender, EventArgs e)
{
SaveFileDialog SFD_Picture = newSaveFileDialog();
SFD_Picture.Title = "Сохранить ка изображение";
SFD_Picture.OverwritePrompt = true;
SFD_Picture.CheckPathExists = true;
SFD_Picture.Filter = "Изображениевформате PNG|*.png|" + "Изображениевформате JPEG|*.jpg|" + "Изображениевформате BMP|*.bmp|" + "Изображениевформате GIF|*.gif|" + "Изображениевформате TIF|*.tif";
drawAreaRect = newRectangle();
drawAreaRect.Width = drawArea.Size.Width;
drawAreaRect.Height = drawArea.Size.Height;
Bitmap drawAreaBitmap = newBitmap(drawArea.Size.Width, drawArea.Size.Height);
drawArea.DrawToBitmap(drawAreaBitmap, drawAreaRect);
// Есливыбрали, сохраняем
if (SFD_Picture.ShowDialog() == DialogResult.OK)
{
// Получаемимяфайлаиздиалога
fileName = SFD_Picture.FileName;
// Получаемрасширенияфайлаиздиалога
strFilExtn = fileName.Remove(0, fileName.Length - 3);
// Сохраняем файл в выбранном расширении
switch (strFilExtn)
{
case"bmp":
drawAreaBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp);
break;
case"jpg":
drawAreaBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case"gif":
drawAreaBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif);
break;
case"tif":
drawAreaBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff);
break;
case"png":
drawAreaBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
break;
default:
break;
}
toolStripStatusLabel.Text = "Изображение " + System.IO.Path.GetFileName(SFD_Picture.FileName) + " успешносохранено! Полныйпуть: " + SFD_Picture.FileName;
}
SFD_Picture.Dispose();
drawAreaBitmap.Dispose();
}
#endregion
Хорошо, а если, например нам потребуется вставить изображение, да ещё и изменить его размеры? Тоже не проблема. Выполним полноценное расширение возможностей нашего приложения добавление нового полноценного объекта рисования -- изображения. Изображение будет добавлять на форму через диалог выбора файла. По умолчанию у него будет чёрная прямоугольная рамка с толщиной пера в один пиксель. После добавления изображения, цвет и толщину пера рамки можно будет поменять (как и у любого другого объекта). Изображение будет полноценно сериализовываться в файле наравне с остальными объектами. Во время рисования, размер изображения будет автоматически подстраиваться под нарисованную рамку. Вставленное изображение можно будет переместить и изменить его размер.
Первое что нужно сделать, это добавить новый класс для рисования объекта изображения. Назовём его DrawImage (файл DrawImage.cs). За основу возьмём класс DrawRectangle, так как он наиболее походит нам для реализации нового класса.
Код класс рисования будет таким:
using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Globalization;
using System.Runtime.Serialization;
using System.Windows.Forms;
namespace LWP15Draw
{
///<summary>
/// Рисование графического объекта "Изображение"
///</summary>
classDrawImage : LWP15Draw.DrawObject
{
privateRectangle rectangle;
privateBitmap _image;
privateBitmap _originalImage; // Оригинальноеизображение
publicBitmap TheImage
{
get { return _image; }
set
{
_originalImage = value;
ResizeImage(rectangle.Width, rectangle.Height);
}
}
privateconststring entryRectangle = "Rect";
privateconststring entryImage = "Image";
privateconststring entryImageOriginal = "OriginalImage";
///<summary>
/// Клонирование данного экземпляра
///</summary>
publicoverrideDrawObject Clone()
{
DrawImage drawImage = newDrawImage();
drawImage._image = _image;
drawImage._originalImage = _originalImage;
drawImage.rectangle = rectangle;
FillDrawObjectFields(drawImage);
return drawImage;
}
protectedRectangle Rectangle
{
get { return rectangle; }
set { rectangle = value; }
}
public DrawImage()
{
SetRectangle(0, 0, 1, 1);
Initialize();
}
public DrawImage(int x, int y)
{
rectangle.X = x;
rectangle.Y = y;
rectangle.Width = 1;
rectangle.Height = 1;
Initialize();
// Устанавливаем перо по умолчанию для каждого нового изображения
Color = Color.Black;
PenWidth = 0;
}
public DrawImage(int x, int y, Bitmap image)
{
rectangle.X = x;
rectangle.Y = y;
_image = (Bitmap)image.Clone();
SetRectangle(rectangle.X, rectangle.Y, image.Width, image.Height);
Initialize();
}
///<summary>
/// лавная функция рисования изображения на форме
///</summary>
///<param name="g"></param>
publicoverridevoid Draw(Graphics g)
{
Pen pen = newPen(Color, PenWidth);
if (_image == null)
{
g.DrawRectangle(pen, rectangle);
}
else
{
g.DrawImage(_image, newPoint(rectangle.X, rectangle.Y));
g.DrawRectangle(pen, rectangle);
}
}
protectedvoid SetRectangle(int x, int y, int width, int height)
{
rectangle.X = x;
rectangle.Y = y;
rectangle.Width = width;
rectangle.Height = height;
}
publicoverrideint HandleCount
{
get { return 8; }
}
///<summary>
/// Получение ключевых точек изображения
///</summary>
///<param name="handleNumber"></param>
///<returns></returns>
publicoverridePoint GetHandle(int handleNumber)
{
int x, y, xCenter, yCenter;
xCenter = rectangle.X + rectangle.Width / 2;
yCenter = rectangle.Y + rectangle.Height / 2;
x = rectangle.X;
y = rectangle.Y;
switch (handleNumber)
{
case 1:
x = rectangle.X;
y = rectangle.Y;
break;
case 2:
x = xCenter;
y = rectangle.Y;
break;
case 3:
x = rectangle.Right;
y = rectangle.Y;
break;
case 4:
x = rectangle.Right;
y = yCenter;
break;
case 5:
x = rectangle.Right;
y = rectangle.Bottom;
break;
case 6:
x = xCenter;
y = rectangle.Bottom;
break;
case 7:
x = rectangle.X;
y = rectangle.Bottom;
break;
case 8:
x = rectangle.X;
y = yCenter;
break;
}
returnnewPoint(x, y);
}
///<summary>
/// Проверка нажатия.
/// Возвращаемые параметры: -1 - нет нажатия
/// 0 - нажатие где угодно
///> 1 - обработка ключевой точки
///</summary>
///<param name="point"></param>
///<returns></returns>
publicoverrideint HitTest(Point point)
{
if (Selected)
{
for (int i = 1; i <= HandleCount; i++)
{
if (GetHandleRectangle(i).Contains(point)) return i;
}
}
if (PointInObject(point)) return 0;
return -1;
}
protectedoverridebool PointInObject(Point point)
{
return rectangle.Contains(point);
}
///<summary>
/// Получение курсора для ключевых точек
///</summary>
///<param name="handleNumber"></param>
///<returns></returns>
publicoverrideCursor GetHandleCursor(int handleNumber)
{
switch (handleNumber)
{
case 1:
returnCursors.SizeNWSE;
case 2:
returnCursors.SizeNS;
case 3:
returnCursors.SizeNESW;
case 4:
returnCursors.SizeWE;
case 5:
returnCursors.SizeNWSE;
case 6:
returnCursors.SizeNS;
case 7:
returnCursors.SizeNESW;
case 8:
returnCursors.SizeWE;
default:
returnCursors.Default;
}
}
///<summary>
/// Изменение размеров объекта изображения
///</summary>
///<param name="point"></param>
///<param name="handleNumber"></param>
publicoverridevoid MoveHandleTo(Point point, int handleNumber)
{
int left = Rectangle.Left;
int top = Rectangle.Top;
int right = Rectangle.Right;
int bottom = Rectangle.Bottom;
switch (handleNumber)
{
case 1:
left = point.X;
top = point.Y;
break;
case 2:
top = point.Y;
break;
case 3:
right = point.X;
top = point.Y;
break;
case 4:
right = point.X;
break;
case 5:
right = point.X;
bottom = point.Y;
break;
case 6:
bottom = point.Y;
break;
case 7:
left = point.X;
bottom = point.Y;
break;
case 8:
left = point.X;
break;
}
Dirty = true;
SetRectangle(left, top, right - left, bottom - top);
ResizeImage(rectangle.Width, rectangle.Height);
}
protectedvoid ResizeImage(int width, int height)
{
if (_originalImage != null)
{
Bitmap b = newBitmap(_originalImage, newSize(width, height));
_image = (Bitmap)b.Clone();
b.Dispose();
}
}
publicoverridebool IntersectsWith(Rectangle rectangle)
{
return Rectangle.IntersectsWith(rectangle);
}
///<summary>
/// Перемещение объекта изображения
///</summary>
///<param name="deltaX"></param>
///<param name="deltaY"></param>
publicoverridevoid Move(int deltaX, int deltaY)
{
rectangle.X += deltaX;
rectangle.Y += deltaY;
Dirty = true;
}
publicoverridevoid Dump()
{
base.Dump();
Trace.WriteLine("rectangle.X = " + rectangle.X.ToString(CultureInfo.InvariantCulture));
Trace.WriteLine("rectangle.Y = " + rectangle.Y.ToString(CultureInfo.InvariantCulture));
Trace.WriteLine("rectangle.Width = " + rectangle.Width.ToString(CultureInfo.InvariantCulture));
Trace.WriteLine("rectangle.Height = " + rectangle.Height.ToString(CultureInfo.InvariantCulture));
}
///<summary>
/// Нормализация объекта прямоугольника
///</summary>
publicoverridevoid Normalize()
{
rectangle = DrawRectangle.GetNormalizedRectangle(rectangle);
}
///<summary>
/// Сохранение объекта изображения в потоке сериализации
///</summary>
///<param name="info"></param>
///<param name="orderNumber"></param>
publicoverridevoid SaveToStream(SerializationInfo info, int orderNumber)
{
info.AddValue(
String.Format(CultureInfo.InvariantCulture,
"{0}{1}", entryRectangle, orderNumber), rectangle);
info.AddValue(
String.Format(CultureInfo.InvariantCulture,
"{0}{1}",
entryImage, orderNumber), _image);
info.AddValue(
String.Format(CultureInfo.InvariantCulture,
"{0}{1}",
entryImageOriginal, orderNumber), _originalImage);
base.SaveToStream(info, orderNumber);
}
///<summary>
/// Загрузка объекта изображения из потока сериализации
///</summary>
///<param name="info"></param>
///<param name="orderNumber"></param>
publicoverridevoid LoadFromStream(SerializationInfo info, int orderNumber)
{
rectangle = (Rectangle)info.GetValue(
String.Format(CultureInfo.InvariantCulture,
"{0}{1}", entryRectangle, orderNumber),
typeof(Rectangle));
_image = (Bitmap)info.GetValue(
String.Format(CultureInfo.InvariantCulture,
"{0}{1}", entryImage, orderNumber),
typeof(Bitmap));
_originalImage = (Bitmap)info.GetValue(
String.Format(CultureInfo.InvariantCulture,
"{0}{1}", entryImageOriginal, orderNumber),
typeof(Bitmap));
base.LoadFromStream(info, orderNumber);
}
#regionВспомогательныефункции
publicstaticRectangle GetNormalizedRectangle(int x1, int y1, int x2, int y2)
{
if (x2 < x1)
{
int tmp = x2;
x2 = x1;
x1 = tmp;
}
if (y2 < y1)
{
int tmp = y2;
y2 = y1;
y1 = tmp;
}
returnnewRectangle(x1, y1, x2 - x1, y2 - y1);
}
publicstaticRectangle GetNormalizedRectangle(Point p1, Point p2)
{
return GetNormalizedRectangle(p1.X, p1.Y, p2.X, p2.Y);
}
publicstaticRectangle GetNormalizedRectangle(Rectangle r)
{
return GetNormalizedRectangle(r.X, r.Y, r.X + r.Width, r.Y + r.Height);
}
#endregion
}
}
Второй класс нам понадобится для реализации инструмента для рисования изображения. ToolImage (ToolImage.cs) выглядиттак:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace LWP15Draw
{
///<summary>
///Изображение
///</summary>
internalclassToolImage : ToolObject
{
public ToolImage()
{
Cursor = newCursor(GetType(), "C_Image.cur");
}
publicoverridevoid OnMouseDown(DrawArea drawArea, MouseEventArgs e)
{
AddNewObject(drawArea, newDrawImage(e.X, e.Y));
}
publicoverridevoid OnMouseMove(DrawArea drawArea, MouseEventArgs e)
{
drawArea.Cursor = Cursor;
if (e.Button == MouseButtons.Left)
{
Point point = newPoint(e.X, e.Y);
drawArea.GraphicsList[0].MoveHandleTo(point, 5);
drawArea.Refresh();
}
}
publicoverridevoid OnMouseUp(DrawArea drawArea, MouseEventArgs e)
{
OpenFileDialog ofd = newOpenFileDialog();
ofd.Title = "Вставкаизображения";
ofd.Filter = "Изображениевформате PNG|*.png|" + "Изображениевформате JPEG|*.jpg|" + "Изображениевформате BMP|*.bmp|" + "Изображениевформате GIF|*.gif|" + "Изображениевформате TIF|*.tif|" + "Изображениявформате ICO|*.ico|" + "Всефайлы|*.*";
ofd.InitialDirectory = Environment.SpecialFolder.MyPictures.ToString();
if (ofd.ShowDialog() == DialogResult.OK)
{
((DrawImage)drawArea.GraphicsList[0]).TheImage = (Bitmap)Bitmap.FromFile(ofd.FileName);
}
ofd.Dispose();
base.OnMouseUp(drawArea, e);
}
}
}
Курсор под инструмент такой:
Не забываем изменить свойство для файла курсора: «Действие при построении» меняем на «Внедрённый ресурс». Добавляем кнопку на панель инструментов сразу после кнопки «Прямоугольник», изображение «по умолчанию» не трогаем:
(Name): |
изображениеToolStripButton |
|
Text: |
&Изображение |
|
ToolTipText: |
Изображение |
В меню «Рисование» добавим новый пункт «Изображение» со следующими свойствами:
(Name): |
изображениеToolStripMenuItem |
|
Text: |
&Изображение |
|
Image: |
Импортируем иконку |
В файле DrawObject.cs находим:
privateconststring entryPenWidth = "PenWidth";
Добавляем после:
// Прочее
privatebool dirty;
В том же файле DrawObject.cs находим:
///<summary>
/// ID объекта
///</summary>
publicint ID
{
get { return id; }
set { id = value; }
}
Добавляем после:
///<summary>
///trueкогдаобъектизменён
///</summary>
publicbool Dirty
{
get { return dirty; }
set { dirty = value; }
}
ВфайлеDrawArea.csнаходим:
publicenumDrawToolType
{
Pointer, Polygon, Line, Ellipse, Rectangle, NumberOfDrawTools
};
Заменяемна:
publicenumDrawToolType
{
Pointer, Polygon, Line, Ellipse, Rectangle, Image, NumberOfDrawTools
};
В том же файле DrawArea.csнаходим:
tools[(int)DrawToolType.Ellipse] = newToolEllipse();
tools[(int)DrawToolType.Rectangle] = newToolRectangle();
Добавляемпосле:
tools[(int)DrawToolType.Image] = newToolImage();
На главной форме инициализируем события двух кнопок «Изображение» в строке меню и на панели инструментов с иконками, а также добавляем общую функцию для двух обработчиков Click:
#regionДобавленныйинструментвставкиизображения
privatevoidизображениеToolStripButton_Click(objectsender, EventArgse)
{
CommandImage();
}
privatevoidизображениеToolStripMenuItem_Click(object sender, EventArgs e)
{
CommandImage();
}
///<summary>
///Изображение
///</summary>
privatevoid CommandImage()
{
drawArea.ActiveTool = DrawArea.DrawToolType.Image;
toolStripStatusLabel.Text = "Выбран инструмент \"Изображение\"";
}
#endregion
Готово. Можно компилировать и проверять работоспособность.
7. Завершающая часть
Компилируем приложение (Release) и запускаем. Рисуем что хотим, при помощи всех доступных инструментов, смотрим что получилось в окне приложения:
Рис. 7. 1. Модифицированное приложение WindowsForms: рисуем
Сохраняем документ («Файл» ->«Сохранить» или «Сохранить как») как Test.lwp, закрываем приложение, вновь запускаем, далее открываем ранее сохранённый файл и смотрим список последних файлов («Файл»):
Рис. 7. 2. Модифицированное приложение WindowsForms: открываем ранее сохранённый файл и просматриваем список последних открытых файлов
Выполняем «Файл» ->«Сохранить как изображение....». Сохраняем документ в формате *.gif (Рис. 7. 3):
Рис. 7. 3. Результат работы приложения: изображение Test.gif, открытое в стандартном редакторе изображений Windows 7
Перетаскиваем объекты в документеTest.lwp, меняем их размеры и свойства:
Рис. 7. 4. Модифицированное приложение WindowsForms: меняем свойства объектов в открытом документе Test.lwp
Рис. 7. 5. Модифицированное приложение WindowsForms: перетаскиваем файл Test.lwpна форму из проводника Windows (в результате файл откроется)
Размещено на Allbest.ru
...Подобные документы
Общая характеристика интерфейса языка программирования 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