Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Задание на курсовое проектирование.
Создание графического редактора в среде программирования BORLAND DELFI.
Словесное описание алгоритма программы.
При запуске программы выводится главное окно, состоящее из холста (Image), главного меню, панели работы с файлом и различных элементов для работы над рисунком (RadioGroup, SpinEdit, Edit, CheckBox, ButtonGroup). При запуске программы происходит окраска холста в белый цвет.
На панели выбора инструментов доступно 9 стилей рисования на холсте: карандаш, заливка, прямая линия, ломаная линия, эллипс, закрашенный эллипс, прямоугольник, закрашенный прямоугольник и вывод текста.
При включенном режиме карандаша (и по умолчанию) на холст наносится линия, соединяющая место, где была нажата кнопка мыши, с местом, где она была отпущена по траектории ее движения (функция LineTo). В режиме заливки происходит заполнение области до ближайшего контура цвета, которым идет заполнение (функция FloodFill). Режим прямой линии схож с режимом карандаша, с той лишь разницей, что точка начала и конца нажатия кнопки соединяется по прямой. Эта разница достигается за счет разницы процедур, при которых выполняются функции LineTo и MoveTo (FormMouseMove для карандаша и FormMouseUp для прямой). Режим ломаной линии наносит прямую на каждое нажатие кнопки мыши. Для него вводится запрет на прорисовку первой линии. Это сделано для того, чтобы не рисовалась линия к первой указанной точке.
Для построения эллипсов и прямоугольников вводятся дополнительные константы X0 и Y0, чтобы зафиксировать первые две координаты фигуры. При нажатии кнопки мыши происходит фиксация первых двух координат, а при отпускании задаются две другие. Между собой эти режимы отличаются способом закраски внутренней области: без заливки и с заливкой соответственно (свойство Brush).
В режиме ввода текста на панно выводится строка, написанная в области в правом нижнем углу окна (Edit). Строка выводится в указанное место нажатием кнопки мыши.
Панель выбора стиля линии позволяет задать необходимый тип линии (для всех инструментов, кроме заливки и вывода текста). Доступно 5 стилей: сплошная линия, пунктирные линии: с длинными штрихами, с короткими штрихами, с чередованием длинного и короткого штрихов, с чередованием одного длинного и двух коротких штрихов. Толщина пунктирной линии не может быть больше 1, поэтому при выборе 2-5 типов толщина автоматически устанавливается равной 1.
Поле ввода толщины линии позволяет выбрать значения в пределах от 1 до 20 пикселов. Так как пунктирная линия не может быть толще 1, то при установке значения большего, чем один, стиль линии автоматически устанавливается сплошным.
Панель “Стиль заливки” позволяет выбрать тип заполнения областей для инструментов: заливка, закрашенный эллипс и закрашенный прямоугольник. Доступно 7 стилей: сплошная заливка, горизонтальная штриховка, вертикальная штриховка, диагональная штриховка с наклоном линий вперед и назад, горизонтально-вертикальная штриховка в клетку, и диагональная штриховка в клетку.
Ниже холста находится цветовая палитра. В ней указывается цвет линии, заливки и шрифта. Всего доступно 20 основных цветов. Кнопка “Расширенная палитра” открывает диалоговое окно стандартной палитры, где можно выбрать подходящий цвет из всех доступных на компьютере.
В правом нижнем углу находится панель работы с текстом: поле для ввода текста, поле изменения размера шрифта и кнопка включения курсива. По умолчанию стоит 8 шрифт, всего же доступны размеры от 6 до 72. Кнопка включения курсива работает по принципу CheckBox, если кнопка нажата, устанавливается курсивный стиль шрифта, если нет (и по умолчанию) шрифт обычный.
Раздел “Вид” главного меню позволяет настроить видимость элементов окна: панели инструментов, параметров линии, параметров заливки, параметров текста и палитры. Если метка напротив пункта стоит, то элементы видимы и активны, если нет невидимы и неактивны (свойства Enabled и Visible).
При выборе пункта меню “Атрибуты рисунка” или при нажатии клавиш Ctrl + A открывается новое окно, в котором задаются ширина и длина холста (элементы SpinEdit). При нажатии кнопки OK, окно закрывается и для размеров холста устанавливаются выбранные значения. При выборе пункта “О программе” (F2) также открывается новое окно. Для его закрытия достаточно нажать кнопкой мыши в любое место формы.
На панели работы с файлом и в первом разделе меню находятся основные пункты работы с файлом. Кнопка “Новый рисунок” очищает холст созданием белого прямоугольника (две координаты по 0, две координаты на длину и на ширину холста). Кнопки загрузки и сохранения рисунка открывают соответствующие диалоговые окна (доступны форматы bmp, ico, emf, wmf). Кнопка “Выход” осуществляет закрытие программы.
Структурная схема алгоритма программы
Выбор стиля линии
Предопределенные процессы: выбор цвета, установка толщины линии, выбор заливки, настройка параметров шрифта аналогичны процессу выбора стиля линии.
Работа инструментов
Очистка экрана
Включение и
выключение панелей
Данный алгоритм работает для всех пяти пунктов раздела «Вид» главного меню.
Распечатка программы.
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
ImageSize in 'ImageSize.pas' {ImageSizeForm},
About in 'About.pas' {AboutForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Image1);
Application.CreateForm(TImageSizeForm, ImageSizeForm);
Application.CreateForm(TAboutForm, AboutForm);
Application.Run;
end.
…………………………………………………………………………..
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Menus, ButtonGroup, Buttons, ExtDlgs, Spin,
ImgList;
type
TForm1 = class(TForm)
Image1: TImage;
MainMenu: TMainMenu;
No: TMenuItem;
N1: TMenuItem;
instr: TMenuItem;
N2: TMenuItem;
BGColor: TButtonGroup;
RGInstr: TRadioGroup;
Panel1: TPanel;
SBOpen: TSpeedButton;
SBSave: TSpeedButton;
SBQuit: TSpeedButton;
SBNew: TSpeedButton;
OPDialog: TOpenPictureDialog;
SPDialog: TSavePictureDialog;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
Atrib: TMenuItem;
SEPenWidth: TSpinEdit;
LLineSize: TLabel;
RGPenStyle: TRadioGroup;
ImageList1: TImageList;
RGBrushStyle: TRadioGroup;
EditText: TEdit;
SETextSize: TSpinEdit;
CBTextStyle: TCheckBox;
LTextSize: TLabel;
line: TMenuItem;
brush: TMenuItem;
text: TMenuItem;
palette: TMenuItem;
N3: TMenuItem;
About: TMenuItem;
ColorDialog: TColorDialog;
SBPalette: TSpeedButton;
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ClearButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BGColorButtonClicked(Sender: TObject; Index: Integer);
procedure SBQuitClick(Sender: TObject);
procedure SBSaveClick(Sender: TObject);
procedure SBOpenClick(Sender: TObject);
procedure AtribClick(Sender: TObject);
procedure SEPenWidthChange(Sender: TObject);
procedure RGPenStyleClick(Sender: TObject);
procedure RGInstrClick(Sender: TObject);
procedure RGBrushStyleClick(Sender: TObject);
procedure SETextSizeChange(Sender: TObject);
procedure instrClick(Sender: TObject);
procedure lineClick(Sender: TObject);
procedure brushClick(Sender: TObject);
procedure textClick(Sender: TObject);
procedure paletteClick(Sender: TObject);
procedure AboutClick(Sender: TObject);
procedure CBTextStyleClick(Sender: TObject);
procedure SBPaletteClick(Sender: TObject);
private
var mouse_button_down: boolean;
var first_click: boolean;
var X0, Y0: integer;
var current_color: TColor;
{ Private declarations }
public
{ Public declarations }
end;
var
Image1: TImage;
Image1width: Cardinal;
Image1height: Cardinal;
implementation
uses ImageSize, About;
{$R *.dfm}
//Выбор цвета
procedure TForm1.BGColorButtonClicked(Sender: TObject; Index: Integer);
begin
case Index of
0: current_color := clBlack;
1: current_color := clMaroon;
2: current_color := clPurple;
3: current_color := clGreen;
4: current_color := clOlive;
5: current_color := clYellow;
6: current_color := clTeal;
7: current_color := clNavy;
8: current_color := clSkyBlue;
9: current_color := clGray;
10: current_color := clWhite;
11: current_color := clRed;
12: current_color := clFuchsia;
13: current_color := clLime;
14: current_color := clMoneyGreen;
15: current_color := clCream;
16: current_color := clAqua;
17: current_color := clBlue;
18: current_color := clMedGray;
19: current_color := clSilver;
end;
Image1.Canvas.Pen.Color := current_color;
Image1.Canvas.Font.Color := current_color;
end;
procedure TForm1.SBPaletteClick(Sender: TObject);
begin
If ColorDialog.Execute then
Image1.Canvas.Pen.Color := ColorDialog.Color;
Image1.Canvas.Brush.Color := ColorDialog.Color;
Image1.Canvas.Font.Color := ColorDialog.Color;
current_color := ColorDialog.Color;
end;
//Выбор толщины линии
procedure TForm1.SEPenWidthChange(Sender: TObject);
begin
Image1.Canvas.Pen.Width:= SEPenWidth.Value;
If SEpenWidth.Value > 1 then
RGPenStyle.ItemIndex := 0
end;
//Выбор стиля линии
procedure TForm1.RGPenStyleClick(Sender: TObject);
begin
If RGPenStyle.ItemIndex = 0 then
Image1.Canvas.Pen.Style := psSolid
else SEPenWidth.Value := 1;
If RGPenStyle.ItemIndex = 1 then
Image1.Canvas.Pen.Style := psDash;
If RGPenStyle.ItemIndex = 2 then
Image1.Canvas.Pen.Style := psDot;
If RGPenStyle.ItemIndex = 3 then
Image1.Canvas.Pen.Style := psDashDot;
If RGPenStyle.ItemIndex = 3 then
Image1.Canvas.Pen.Style := psDashDotDot;
end;
//Выбор стиля заливки
procedure TForm1.RGBrushStyleClick(Sender: TObject);
begin
If RGBrushStyle.ItemIndex = 0 then
Image1.Canvas.Brush.Style := bsSolid;
If RGBrushStyle.ItemIndex = 1 then
Image1.Canvas.Brush.Style := bsHorizontal;
If RGBrushStyle.ItemIndex = 2 then
Image1.Canvas.Brush.Style := bsVertical;
If RGBrushStyle.ItemIndex = 3 then
Image1.Canvas.Brush.Style := bsFDiagonal;
If RGBrushStyle.ItemIndex = 4 then
Image1.Canvas.Brush.Style := bsBDiagonal;
If RGBrushStyle.ItemIndex = 5 then
Image1.Canvas.Brush.Style := bsCross;
If RGBrushStyle.ItemIndex = 6 then
Image1.Canvas.Brush.Style := bsDiagCross;
end;
// Выбор размера шрифта
procedure TForm1.SETextSizeChange(Sender: TObject);
begin
Image1.Canvas.Font.Size := SETextSize.Value;
end;
//Выбор стиля шрифта
procedure TForm1.CBTextStyleClick(Sender: TObject);
begin
If CBTextStyle.Checked then
Image1.Canvas.Font.Style := [fsItalic]
else Image1.Canvas.Font.Style := []
end;
//Очистка рисунка
procedure TForm1.ClearButtonClick(Sender: TObject);
var
rect: TRect;
begin
Image1.Canvas.Brush.Color := clWhite;
Image1.Canvas.Brush.Style := bsSolid;
rect.Left := 0;
rect.Top := 0;
rect.Right := Image1.Width;
rect.Bottom := Image1.Height;
Image1.Canvas.FillRect( rect );
end;
//Подготовка холста (окраска в белый цвет)
procedure TForm1.FormCreate(Sender: TObject);
begin
ClearButtonClick( Sender );
Image1width := Image1.Width;
Image1height := Image1.Height;
first_click := true;
mouse_button_down := false;
X0 := 0;
Y0 := 0;
end;
//Включение первого клика на рисовании
procedure TForm1.RGInstrClick(Sender: TObject);
begin
first_click := true;
end;
//Рисование
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
mouse_button_down := true;
X0 := X;
Y0 := Y;
If first_click then
begin
Image1.Canvas.MoveTo(X,Y); //чтобы линия не начиналась из угла
first_click := false;
end;
end;
//Установка координат для прямоугольника и Эллипса
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
rect: TRect;
begin
mouse_button_down := false;
rect.Left := x0;
rect.Top := y0;
rect.Right := X;
rect.Bottom := Y;
If RgInstr.ItemIndex <> 3 then //чтобы фигура рисовалась сразу
first_click := true;
//заливка
If RgInstr.ItemIndex = 1 then
begin
Image1.Canvas.Brush.Color := current_color;
Image1.Canvas.FloodFill(X,Y,current_color,fsBorder);
end
// прямая линия
Else If RGInstr.ItemIndex = 2 then
begin
Image1.Canvas.LineTo(X,Y);
Image1.Canvas.MoveTo (X,Y);
end
Else If RgInstr.ItemIndex = 3 then // ломаная линия
Image1.Canvas.LineTo(X,Y)
Else If RgInstr.ItemIndex = 4 then // эллипс
begin
Image1.Canvas.Brush.Color := clWindow;
Image1.Canvas.Ellipse( rect );
end
Else If RgInstr.ItemIndex = 5 then // закрашенный эллипс
begin
Image1.Canvas.Brush.Color := current_color;
Image1.Canvas.Ellipse( rect )
end
Else If RgInstr.ItemIndex = 6 then // прямоугольник
begin
Image1.Canvas.Brush.Color := clWindow;
Image1.Canvas.Rectangle( rect )
end
Else If RgInstr.ItemIndex = 7 then // закрашенный прямоугольник
begin
Image1.Canvas.Brush.Color := current_color;
Image1.Canvas.Rectangle ( rect );
end
Else If RGInstr.ItemIndex = 8 then //вывод текста
begin
first_click := false;
Image1.Canvas.Brush.Style:=bsClear;
Image1.Canvas.TextOut(X,Y,EditText.Text);
end;
End;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
BEGIN
If mouse_button_down then
// карандаш
if RGInstr.ItemIndex = 0 then
Image1.Canvas.LineTo( X, Y );
END;
//Насторойка вида главного окна
procedure TForm1.instrClick(Sender: TObject);
begin
If Instr.Checked = false then
begin
RGInstr.Visible := false;
RGInstr.Enabled := false;
end
else begin
RGInstr.Visible := true;
RGInstr.Enabled := true;
end;
end;
procedure TForm1.lineClick(Sender: TObject);
begin
If Line.Checked = false then
begin
RGPenStyle.Visible := false;
RGPenStyle.Enabled := false;
LLineSize.Visible := false;
SEPenWidth.Visible := false;
SEPenWidth.Enabled := false;
end
else begin
RGPenStyle.Visible := true;
RGPenStyle.Enabled := true;
LLineSize.Visible := true;
SEPenWidth.Visible := true;
SEPenWidth.Enabled := true;
end;
end;
procedure TForm1.brushClick(Sender: TObject);
begin
If Brush.Checked = false then
begin
RGBrushStyle.Visible := false;
RGBrushStyle.Enabled := false;
end
else begin
RGBrushStyle.Visible := true;
RGBrushStyle.Enabled := true;
end;
end;
procedure TForm1.textClick(Sender: TObject);
begin
If Text.Checked = false then
begin
EditText.Visible := false;
EditText.Enabled := false;
SETextSize.Visible := false;
SETextSize.Enabled := false;
LTextSize.Visible := false;
CBTextStyle.Visible := false;
CBTextStyle.Enabled := false;
end
else begin
EditText.Visible := true;
EditText.Enabled := true;
SETextSize.Visible := true;
SETextSize.Enabled := true;
LTextSize.Visible := true;
CBTextStyle.Visible := true;
CBTextStyle.Enabled := true;
end;
end;
procedure TForm1.paletteClick(Sender: TObject);
begin
If Palette.Checked = false then
begin
BGColor.Visible := false;
BGColor.Enabled := false;
SBPalette.Visible := false;
SBPalette.Enabled := false;
end
else begin
BGColor.Visible := true;
BGColor.Enabled := true;
SBPalette.Visible := true;
SBPalette.Enabled := true;
end;
end;
procedure TForm1.SBOpenClick(Sender: TObject); //открытие файла
begin
If OPDialog.Execute then
Image1.Picture.LoadFromFile (OPDialog.FileName);
end;
procedure TForm1.SBSaveClick(Sender: TObject); //сохранение файла
begin
If SPDialog.Execute then
Image1.Picture.SavetoFile (SPDialog.FileName);
end;
procedure TForm1.SBQuitClick(Sender: TObject); //выход из программы
begin
Close
end;
procedure TForm1.AboutClick(Sender: TObject); //о программе
begin
If AboutForm.ShowModal = mrOk then
end;
procedure TForm1.AtribClick(Sender: TObject); //изменение атрибутов рисунка
begin
ImageSizeForm.SEWidth.Value := Image1width;
ImageSizeForm.SEHeight.Value := Image1height;
If ImageSizeForm.ShowModal = mrOk then
begin
Image1width := ImageSizeForm.SEWidth.Value;
Image1height := ImageSizeForm.SEHeight.Value;
Image1.Width := Image1width;
Image1.Height := Image1height;
Image1.Refresh;
end;
end;
end.
………………………………………………………………………………………..
unit ImageSize;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Spin;
type
TImageSizeForm = class(TForm)
BBOK: TBitBtn;
SEWidth: TSpinEdit;
SEHeight: TSpinEdit;
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
ImageSizeForm: TImageSizeForm;
implementation
uses Unit1;
{$R *.dfm}
end.
……………………………………………………………………………
unit About;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TAboutForm = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure FormClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
AboutForm: TAboutForm;
implementation
uses Unit1;
{$R *.dfm}
procedure TAboutForm.FormClick(Sender: TObject);
begin
Close;
end;
end.
Список литературы: