Міністерство освіти і науки України
Хмельницький національний університет
Кафедра системного програмування
Лабораторна робота №6
з програмування
на тему:
«Розробка складних додатків з використанням графіки»
Лабораторна робота №6
Тема: Розробка складних додатків з використанням графіки.
Мета:ознайомитись з графічними можливостями середовища Delphi та навчитись їх застосовувати за призначенням.
Завдання
Розробити графічний редактор з можливостями кисті та заливки, який може працювати з графічними файлами (відкрити, зберегти) та містить головне меню з пунктами “Файл”, “Формат ”, “Про програму”. Пункт меню “Файл” містить підпункти “Відкрити”, “Зберегти”, “Вихід”. Пункт меню “Формат” містить підпункти редагування розміру кисті та кольору.
Project1.lpr
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1, LResources, Printer4Lazarus
{ you can add units after this };
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
begin
{$I project1.lrs}
Application.Title:='Текстовий редактор';
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Unit1.pas
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, Menus, StdCtrls, ExtCtrls, Spin;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton; Button2: TButton; Button3: TButton;
ColorDialog1: TColorDialog;
MainMenu1: TMainMenu;
MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem;
MenuItem4: TMenuItem; MenuItem5: TMenuItem; MenuItem6: TMenuItem;
MenuItem7: TMenuItem; MenuItem8: TMenuItem; MenuItem9: TMenuItem;
MenuItem10: TMenuItem; MenuItem11: TMenuItem; MenuItem12: TMenuItem;
MenuItem13: TMenuItem; MenuItem14: TMenuItem; MenuItem15: TMenuItem;
MenuItem16: TMenuItem; MenuItem17: TMenuItem; MenuItem18: TMenuItem;
OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog;
PaintBox1: TPaintBox;
SpinEdit1: TSpinEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure MenuItem10Click(Sender: TObject);
procedure MenuItem11Click(Sender: TObject);
procedure MenuItem12Click(Sender: TObject);
procedure MenuItem13Click(Sender: TObject);
procedure MenuItem14Click(Sender: TObject);
procedure MenuItem15Click(Sender: TObject);
procedure MenuItem16Click(Sender: TObject);
procedure MenuItem17Click(Sender: TObject);
procedure MenuItem18Click(Sender: TObject);
procedure MenuItem4Click(Sender: TObject);
procedure MenuItem5Click(Sender: TObject);
procedure MenuItem6Click(Sender: TObject);
procedure MenuItem9Click(Sender: TObject);
procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure PaintBox1Paint(Sender: TObject);
procedure SpinEdit1Change(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var Form1: TForm1; StartX, StartY,a:integer;
pn,sv:boolean; clr:TColor; BM,BMt:TBitmap;
FName,FLoad:string; SRect, DRect: TRect;
implementation
{ TForm1 }
procedure TForm1.MenuItem4Click(Sender: TObject); //відкрити
begin
if not sv then MenuItem5Click(Sender);
OpenDialog1.Filter:='Bitmap|*.bmp|All|*.*';
if OpenDialog1.Execute then
begin sv:=false;
FLoad:=OpenDialog1.FileName;
BMt:=TBitmap.Create;
BMt.LoadFromFile(FLoad);
PaintBox1.Canvas.Clear; BM.LoadFromFile(FLoad);
PaintBox1.Width:=BMt.Width;
PaintBox1.Height:=BMt.Height;
PaintBox1.Canvas.Draw(0,0,BM);
BMt.Free;
end;
end;
procedure TForm1.MenuItem5Click(Sender: TObject); //зберегти
begin
BMt:=TBitmap.Create;
BMt.Width:=PaintBox1.Width;
BMt.Height:=PaintBox1.Height;
DRect:=Rect(0,0,PaintBox1.Width,PaintBox1.Height);
SRect:=Rect(0,0,BMt.Width,BMt.Height);
BMt.Canvas.CopyRect(SRect,PaintBox1.Canvas,DRect);
SaveDialog1.Filter:='Bitmap|*.bmp|All|*.*';
if SaveDialog1.Execute then
begin
FName:=(SaveDialog1.FileName);
BMt.SaveToFile(FName+'.bmp');
sv:=True; BMt.Free;
end;
end;
procedure TForm1.MenuItem6Click(Sender: TObject); //закрити
begin
Form1.Close;
end;
procedure TForm1.MenuItem9Click(Sender: TObject); //зменшити кисть
begin
PaintBox1.Canvas.Pen.Width:=PaintBox1.Canvas.Pen.Width-1;
if PaintBox1.Canvas.Pen.Width=1 then exit;
end;
procedure TForm1.MenuItem10Click(Sender: TObject); //збільшити кисть
begin
PaintBox1.Canvas.Pen.Width:=PaintBox1.Canvas.Pen.Width+1;
if PaintBox1.Canvas.Pen.Width>=100 then exit;
end;
procedure TForm1.MenuItem11Click(Sender: TObject); //вказати розмір
begin
a:=StrToInt(InputBox('Зміна розміру кисті','Введіть значення:',''));
a:=a div 1;
if a<1 then PaintBox1.Canvas.Pen.Width:=1 else
if a>100 then PaintBox1.Canvas.Pen.Width:=100 else
PaintBox1.Canvas.Pen.Width:=a;
end;
procedure TForm1.MenuItem12Click(Sender: TObject); //чорний
begin
clr:=clBlack;
end;
procedure TForm1.MenuItem13Click(Sender: TObject); //червоний
begin
clr:=clRed;
end;
procedure TForm1.MenuItem14Click(Sender: TObject); //синій
begin
clr:=clBlue;
end;
procedure TForm1.MenuItem15Click(Sender: TObject); //зелений
begin
clr:=clGreen;
end;
procedure TForm1.MenuItem16Click(Sender: TObject); //білий
begin
clr:=clWhite;
end;
procedure TForm1.MenuItem17Click(Sender: TObject); //вказати колір
begin
if ColorDialog1.Execute then clr:=ColorDialog1.Color;
end;
procedure TForm1.MenuItem18Click(Sender: TObject); //Про програму
begin
ShowMessage('Графічний редактор призначений для створення і збереження малюнків в форматі .bmp.'+#13+'При малюванні можна змінювати розмір та колір кисті для малювання.'+#13+'Розробник: Ноль М.Г., КІ-10-1.');
end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
PaintBox1.Canvas.Pen.Width:=SpinEdit1.Value;
end;
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StartX:=X; StartY:=Y;
if pn=True then
begin
PaintBox1.Canvas.Brush.Color:=clr;
PaintBox1.Canvas.FloodFill(X,Y,PaintBox1.Canvas.Pixels[X,Y],fsSurface);
sv:=False;
BM.Width:=PaintBox1.Width;
BM.Height:=PaintBox1.Height;
DRect:=Rect(0,0,PaintBox1.Width,PaintBox1.Height);
SRect:=Rect(0,0,BM.Width,BM.Height);
BM.Canvas.CopyRect(SRect,PaintBox1.Canvas,DRect);
end else
PaintBox1.Canvas.Pen.Color:=clr;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if not (ssLeft in Shift) then
Exit;
with PaintBox1.Canvas do begin
MoveTo(StartX,StartY);
LineTo(X,Y);
end;
StartX:=X;
StartY:=Y;
sv:=False;
BM.Width:=PaintBox1.Width;
BM.Height:=PaintBox1.Height;
DRect:=Rect(0,0,PaintBox1.Width,PaintBox1.Height);
SRect:=Rect(0,0,BM.Width,BM.Height);
BM.Canvas.CopyRect(SRect,PaintBox1.Canvas,DRect);
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
if not sv then begin PaintBox1.Canvas.Clear; PaintBox1.Canvas.Draw(0,0,BM); end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
BMt:=TBitmap.Create;
BMt.Width:=PaintBox1.Width;
BMt.Height:=PaintBox1.Height;
DRect:=Rect(0,0,PaintBox1.Width,PaintBox1.Height);
SRect:=Rect(0,0,BMt.Width,BMt.Height);
BMt.Canvas.CopyRect(SRect,PaintBox1.Canvas,DRect);
CanClose:=MessageDlg('Графічний редактор','Дійсно закрити?',mtConfirmation,[mbYes,mbNo],0)=mrYes;
if CanClose and not sv then if (MessageDlg('Графічний редактор','Зберегти перед виходом ?',mtConfirmation,[mbYes,mbNo],0)=mrYes) then
begin
SaveDialog1.Filter:='Bitmap|*.bmp|All|*.*';
if SaveDialog1.Execute then
begin FName:=(SaveDialog1.FileName);
BMt.SaveToFile(FName+'.bmp'); sv:=True;
end;
end;
BMt.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
pn:=False;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
pn:=True;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
PaintBox1.Canvas.Brush.Color:=clWhite;
PaintBox1.Canvas.Clear;
PaintBox1.Color:=clWhite;
BM.Width:=PaintBox1.Width;
BM.Height:=PaintBox1.Height;
DRect:=Rect(0,0,PaintBox1.Width,PaintBox1.Height);
SRect:=Rect(0,0,BM.Width,BM.Height);
BM.Canvas.CopyRect(SRect,PaintBox1.Canvas,DRect);
pn:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PaintBox1.Canvas.Pen.Width:=1;
PaintBox1.Canvas.Pen.Color:=clBlack;
sv:=True;
BM:=TBitmap.Create;
BM.Width:=PaintBox1.Width;
BM.Height:=PaintBox1.Height;
end;
initialization
{$I unit1.lrs}
end.
Висновок. Виконавши лабораторну роботу, я освоїв роботу програм з такими графічними компонентами як TPaintBox та його властивістю Canvas, яка дає можливість малювати на компоненті. Розглянув принципи роботи з властивостями канви Pen та Brush, її методами Rect, CopyRect, Clear та інші. Також закріпив навички роботи з компонентами середовища Delphi TMainMenu та діалогами TOpenDialog TSaveDialog, зрозумів основні принципи створення графічного редактора.
//