Прыклад 14.2. Стварыць праект, у якім будзе будавацца малюнак «сердечка». Карыстальнік задае вышыню і шырыню малюнка. Месцазнаходжанне малюнка будзе вызначацца клікам мышы (у пункце, дзе клікнулі, павінен размяшчацца цэнтр малюнка). Калі малюнак цалкам не змяшчаецца ў вобласці малявання, то варта вывесці адпаведнае паведамленне.
Этапы выканання задання
- Размясціць на форме кампаненты: Image і два кампаненты LabeledEdit для ўводу памераў малюнка.
- Напісаць апрацоўшчык падзеі OnMouseDown для кампанента Image1.
2.1. Па кліку мышы малюем «сердечко». 2.2. Для малявання аднаго відарыса апішам функцыю heart. Гэтая функцыя павінна стаць метадам формы, таму яе аб'яву трэба дадаць ў загалоўкавы файл. Для таго каб функцыя была вызначана ў вобласці бачнасці класа формы перад яе загалоўкам неабходна прапісаць void __fastcall TForm1::. 2.3. Малюнак «сердечка» можна разбіць на часткі: роўнабаковы трохвугольнік і два паўкруга. 2.3.1. Для пабудовы трохвугольніка будзем выкарыстоўваць метад канвы Polygon. У гэтага метаду два параметры — масіў пунктаў і нумар пункту ў масіве, які трэба злучыць з нулявым. Масіў з трох пунктаў можна апісаць наступным чынам: TPoint t[3] = {{x4,y4},{x6,y6},{x3,y3}}; 2.3.2. Для пабудовы паўкруга будзем выкарыстоўваць метад канвы Pie. 2.4. Усе каардынаты для малявання разлічваюцца адносна цэнтральнай кропкі і памераў малюнка, уведзеных карыстальнікам. 2.5. Малюнак будзем будаваць з чырвонай мяжой і зальём яго чырвоным колерам.
- Праверыць, ці змесціцца малюнак у вобласць малявання, можна лічачы, што прамавугольнік, вызначаны дыяганаллю (x1; y1) — (x2; y2), павінен змяшчацца ў кампанент Image1.
Прыклад 14.3. Стварыць праект, у якім можна будзе выбіраць, як размяшчаць «сердечки»:
а) адно «сердечко» у выпадковым месцы Image; б) «сердечки» размешчаны па адным у шэраг уздоўж левага краю Image; в) «сердечки» раўнамерна запаўняюць увесь Image.
Выбар неабходна здзяйсняць з дапамогай адпаведных кнопак.
Этапы выканання задання
- Размясціць на форме: кампанент Image і тры кнопкі.
- Будзем выкарыстоўваць функцыю малявання «сердечка» з прыкладу 14.2.
- Напісаць апрацоўшчык падзеі OnClick для кампанента Button1. Малюем адно «сердечко». Памер і месцазнаходжанне вызначаем выпадковым чынам.
- Напісаць апрацоўшчык падзеі OnClick для кампанента Button2. У цыкле мяняем вертыкальную каардынату, якая вызначае месцазнаходжанне «сердечка». Памер — 30 на 30 пікселяў. Цыкл выконваецца, пакуль вертыкальная каардыната менш вышыні Image1.
- Напісаць апрацоўшчык падзеі OnClick для кампанента Button3. Выкарыстоўваем два ўкладзеных цыклы, у якіх будуць мяняцца гарызантальная і вертыкальная каардынаты, якія вызначаюць месцазнаходжанне «сердечка». Памер — 30 на 30 пікселяў. Цыклы выконваюцца, пакуль каардынаты менш памераў Image1.
- У пачатку кожнага апрацоўшчыка неабходна чысціць Image1 ад папярэдніх малюнкаў.
|
Прыклад 14.2. Даданне метаду heart у загалоўкавы файл формы:

Разлік элементаў малюнка:

Значэнні ўводзяцца карыстальнікам, значэнне d = w/2. Значэнні x0, y0 вызначаюцца клікам мышы, астатнія каардынаты вылічаюцца па наступных формулах:
x1 = x0 – w/2; y1 = y0 – h/2; x2 = x0 + w/2; y2 = y0 + h/2; x3 = x1; y3 = y1 + d/2; x4 = x2; y4 = y3; x5 = x3 + d; y5 = y3; x6 = x5; y6 = y2;
Апрацоўшчык падзеі OnMouseDown і функцыя малявання:
void __fastcall TForm1::heart(int x0, int y0, int w, int h)
{
Image1 -> Canvas -> Pen -> Color = clRed;
Image1 -> Canvas -> Brush -> Color = clRed;
int d = w / 2;
int x1 = x0 - w/2, y1 = y0 - h/2;
int x2 = x0 + w/2, y2 = y0 + h/2;
int x3 = x1, y3 = y1 + d/2;
int x4 = x2, y4 = y3;
int x5 = x3 + d, y5 = y3;
int x6 = x5, y6 = y2;
Image1 -> Canvas -> Pie(x1, y1, x5, y5 + d / 2, x5, y5, x3, y3);
Image1 ->Canvas -> Pie(x5, y5 - d / 2, x4, y4 + d / 2, x4, y4, x5, y5);
TPoint t[3] = {{x4,y4},{x6,y6},{x3,y3}};
Image1 ->Canvas ->Polygon(t, 2);
}
//---------------------------------
void __fastcall TForm1::Image1MouseDown (TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
int width = StrToInt(LabeledEdit1 ->Text);
int height = StrToInt(LabeledEdit2 ->Text);
if (X - width / 2 < 0 || Y - height / 2 < 0 ||
X + width / 2 > Image1 -> Width ||
Y + height / 2 > Image1 -> Height)
ShowMessage("Не поместится");
else
heart(X, Y, width, height);
}
|
Дадатак у час працы:

Прыклад 14.3. Апрацоўшчыкі падзей для кнопак:
void __fastcall TForm1::Button1Click (TObject *Sender)
{
Image1 -> Canvas -> Pen -> Color = clWhite;
Image1 -> Canvas -> Brush -> Color = clWhite;
Image1 -> Canvas -> Rectangle(0, 0,
Image1 -> Width, Image1 -> Height);
int width = rand() % 300 + 30;
int height = rand() % 300 + width;
int x = rand() %(Image1 ->Width - 2 * width) + width / 2;
int y = rand() %(Image1 ->Height - 2 * height) + height / 2;
heart(x, y, width, height);
}
//---------------------------------
void __fastcall TForm1::Button2Click (TObject *Sender)
{
Image1 -> Canvas -> Pen -> Color = clWhite;
Image1 -> Canvas -> Brush -> Color = clWhite;
Image1 -> Canvas -> Rectangle(0, 0,
Image1 -> Width, Image1 -> Height);
for (int y = 16; y < Image1 -> Height - 16; y += 45)
heart(16, y, 30, 30);
}
//---------------------------------
void __fastcall TForm1::Button3Click (TObject *Sender)
{
Image1 -> Canvas -> Pen -> Color = clWhite;
Image1 -> Canvas -> Brush -> Color = clWhite;
Image1 -> Canvas -> Rectangle(0, 0,
Image1 -> Width, Image1 -> Height);
for (int x = 16; x < Image1 -> Width - 16; x += 45)
for (int y = 16; y < Image1 -> Height - 16; y += 45)
heart(x, y, 30, 30);
}
|
Дадатак у час працы:



|