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

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

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

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

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

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

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

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

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

Для таго каб праграма загружалася з бачнай вобласцю для малявання, трэба пры стварэнні формы выканаць які-небудзь зварот да 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. Пункты меню Цвет дазваляюць выбраць колер лініі або заліўкі адпаведна. Пры выбары колеру на панэлі ColorGrid1 даступныя толькі 16 базавых колераў, пры выбары колеру з меню — стандартная RGB палітра.

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

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

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

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

void __fastcall TForm1::FormCreate
               (TObject *Sender)

{

  OpenPictureDialog1->InitialDir = 

    ExtractFilePath(ParamStr(0));

  SavePictureDialog1->InitialDir = 

    OpenPictureDialog1->InitialDir;

  Image1->Canvas->Pixels[0][0] = clWhite;

}

 

void __fastcall TForm1::
Image1MouseDown(TObject *Sender, 
TMouseButton Button, TShiftState Shift, 
int X, int Y)

{

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

  if (Button == mbLeft)

  Image1->Canvas->MoveTo(X,Y);

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

  if (Button == mbRight)

  Image1->Canvas->FloodFill

    (X, Y, Image1->Canvas->

    Pixels[X][Y],fsSurface);

}

 

void __fastcall TForm1::

Image1MouseMove(TObject *Sender, 
TShiftState Shift, int X, int Y)

{

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

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

  if (Shift.Contains(ssLeft))

  Image1->Canvas->LineTo(X,Y);

}

 

void __fastcall TForm1::

ColorGrid1Change(TObject *Sender)

{

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

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

  Image1->Canvas->Pen->Color = 

    ColorGrid1->ForegroundColor;

  Panel1->Color = 

    ColorGrid1->ForegroundColor;

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

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

  Image1->Canvas->Brush->Color = 

    ColorGrid1->BackgroundColor;

  Panel2->Color = 

    ColorGrid1->BackgroundColor;

}

 

void __fastcall TForm1::

SpinEdit1Change(TObject *Sender)

{

  Image1->Canvas->Pen->Width = 

    SpinEdit1->Value;

}

 

void __fastcall TForm1::N2Click

(TObject *Sender)

{

  Image1->Picture = NULL;

  Image1->Canvas->Pixels[0][0] = clWhite;

  SpinEdit1->Value = 1;

  Panel1->Color = clWhite;

  Panel2->Color = clBlack;

}

 

void __fastcall TForm1::N3Click

(TObject *Sender)

{

  if (OpenPictureDialog1->Execute()) {

  FileName = OpenPictureDialog1->FileName;

  Image1->Picture->LoadFromFile(FileName);

  Form1->Caption = "MyPaint " + FileName;

  }

}

 

void __fastcall TForm1::N4Click

(TObject *Sender)

{

  if (SavePictureDialog1->Execute()) {

  FileName = SavePictureDialog1->FileName;

  Image1->Picture->SaveToFile(FileName);

  Form1->Caption = "MyPaint " + FileName;

  }

}

 

void __fastcall TForm1::N6Click

(TObject *Sender)

{

  Form1->Close();

}

 

void __fastcall TForm1::N8Click

(TObject *Sender)

{

  if (ColorDialog1->Execute()) {

    Panel1->Color = ColorDialog1->Color;

    Image1->Canvas->Pen->Color = 

      ColorDialog1->Color;

  }

}

 

void __fastcall TForm1::N9Click

(TObject *Sender)

{

  if (ColorDialog1->Execute()) {

    Panel2->Color = ColorDialog1->Color;

    Image1->Canvas->Brush->Color = 

      ColorDialog1->Color;

  }

}

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