§ 5. Стварэнне дадаткаў

5.5. Стварэнне дадатку «Графічны рэдактар»

Праграма павінна даваць магчымасць адкрыць і захаваць файл, выбраць колер лініі і колер фону, устанавіць таўшчыню лініі. Маляванне выконваецца вылучаным колерам лініі пры націснутай левай клавішы мышы. Пры націску правай клавішы мышы адбываецца перафарбоўка колерам фону абмежаванай вобласці.

Спачатку спраектуем форму, размясціўшы на ёй наступныя кампаненты (прыклад 5.20):

  • вобласць для малявання — Image1;
  • палітру асноўных 16 колераў — ColorGrid1 (панэль кампанентаў Samples);
  • кампаненты, якія адлюстроўваюць абраны колер для малявання і колер фону — Panel1, Panel2;
  • кампанент выбару колеру — ColorDialog1;
  • кампанент для выбару таўшчыні лініі — SpinEdit1 (панэль кампанентаў Samples);
  • галоўнае меню — MainMenu1 і кампаненты для работы з файламі — OpenPictureDialog1, SavePictureDialog1.

Ва ўласцівасці GridOrdening для кампанента ColorGrid1 устанавіць значэнне go8x2, якое дазволіць размясціць кампанент гарызантальна.

На этапе канструявання ўстанавіць значэнне ўласцівасці Color у кампанентаў Panel1 і Panel2 — clBlack і clWhite адпаведна.

Ва ўласцівасцях Value і MinValue для кампанента SpinEdit1 устанавіць значэнне 1.

Структура меню паказана ў прыкладзе 5.21. Апрацоўшчыкі падзей прыведзены ў прыкладзе 5.22.

Для таго каб праграма загружалася з бачнай вобласцю для малявання, трэба пры стварэнні формы выканаць які-небудзь зварот да Image1, напрыклад зафарбаваць белым колерам піксель з каардынатамі (0; 0).

Для праверкі націснутай клавішы мышы апішам апрацоўшчык падзеі OnMouseDown для кампанента Image1. Параметр Button у гэтага апрацоўшчыка можа прымаць значэнні mbLeft або mbRight у залежнасці ад націснутай левай ці правай клавішы мышы.

Для адсочвання траекторыі руху мышы па кампаненце Image1 ствараем апрацоўшчык падзеі OnMouseMove. Параметр Shift у апрацоўшчыка дазваляе вызначыць, якая з клавіш мышы была націснутая, а параметры x, y вяртаюць каардынаты пункту, у якім адбыўся націск кнопкі.

Для перамяшчэння мышы трэба выкарыстоўваць метады Canvas: LineTo(x, y) — перамяшчэнне са следам і MoveTo(x, y) — перамяшчэнне без следу.

Апрацоўшчык падзеі OnChange для кампанента ColorGrid1 дазволіць вызначыць вылучаны колер. Уласцівасці ForegroundColor і BackgroundColor у гэтага кампанента, якія адказваюць за асноўны і фонавы колеры, змяняюцца пры націску левай і правай кнопак адпаведна. Паралельна змяняецца колер панэляў.

Таўшчыня лініі вызначаецца значэннем уласцівасці Value для кампанента SpinEdit1. Апрацоўшчык падзеі — OnChange.

Апрацоўшчыкі падзей для кампанентаў OpenPictureDialog1, SavePictureDialog1 выклікаюцца з адпаведных пунктаў меню і з'яўляюцца аналагічнымі апрацоўшчыкам, апісаным для праграмы Блакнот. Для захавання і загрузкі файлаў трэба апісаць глабальную радковую пераменную FileName. Дадатак можа захоўваць і загружаць файлы фармату bmp.

З дапамогай кампанента ColorDialog1 можна выбраць колер лініі або заліўкі, адсутныя на панэлі ColorGrid1. Пункты меню Цвет, дазваляюць выбраць колер лініі або заліўкі адпаведна.

Стварэнне малюнка і загрузка файла ў дадатак прыведзены ў прыкладзе 5.23.

Прыклад 5.20. Форма на этапе канструявання:

Прыклад 5.21. Структура меню:

Прыклад 5.22. Апрацоўшчыкі падзей:

procedure TForm1.FormCreate(Sender: TObject);

begin

  Image1.Canvas.Pixels[0,0] := clWhite;

end;

 

procedure TForm1.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

  //націснута левая клавіша мышы

  if Button = mbLeft then

    Image1.Canvas.MoveTo(x,y);

  //націснута правая клавіша мышы

  if Button = mbRight then

    Image1.Canvas.FloodFill(x, y, Image1.Canvas.pixels[x,y],fsSurface);

end;

 

procedure TForm1.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

  //перамяшчэнне з націснутай левай

  //кнопкай мышы

  if ssLeft in Shift then

    Image1.Canvas.LineTo(x,y);

end;

 

procedure TForm1.ColorGrid1Change(Sender: TObject);

begin

  //выбар асноўнага колеру

  //левай клавішай мышы

  Image1.Canvas.Pen.Color := ColorGrid1.ForegroundColor;

  Panel1.Color := ColorGrid1.ForegroundColor;

  //выбар фонавага колеру

  //правай клавішай мышы

  Image1.Canvas.Brush.Color := ColorGrid1.BackgroundColor;

  Panel2.Color := ColorGrid1.BackgroundColor;

end;

 

procedure TForm1.SpinEdit1Change(Sender: TObject);

begin

  Image1.Canvas.Pen.Width := SpinEdit1.Value;
end;

procedure TForm1.N2Click(Sender: TObject);

begin

  Image1.Picture := Nil;

  Image1.Canvas.Pixels[0,0] := clWhite;

end;

 

procedure TForm1.N3Click(Sender: TObject);

begin

  if OpenPictureDialog1.Execute then

  begin

    FileName:=OpenPictureDialog1.FileName;

    Image1.Picture.LoadFromFile(FileName);

    Form1.Caption:='MyPaint '+FileName;

  end;

end;

 

procedure TForm1.N4Click(Sender: TObject);

begin

  if SavePictureDialog1.Execute then

  begin

    FileName:=SavePictureDialog1.FileName;

    Image1.Picture.SaveToFile(FileName);

    Form1.Caption:='myPaint '+FileName;

  end;

end;

 

procedure TForm1.N6Click(Sender: TObject);

begin

  Form1.Close;

end;

 

procedure TForm1.N8Click(Sender: TObject);

begin

  if ColorDialog1.Execute then

  begin

    Panel1.Color:=ColorDialog1.Color;

    Image1.Canvas.Pen.Color := ColorDialog1.Color;
  end;
end;

 

procedure TForm1.N9Click(Sender: TObject);

begin

  if ColorDialog1.Execute then

  begin

    Panel2.Color:=ColorDialog1.Color;

    Image1.Canvas.Brush.Color := ColorDialog1.Color;

  end;

end;

Прыклад 5.23. Дадатак у час працы: