Проект 2
Створіть на диску Е: у своєму каталозі новий проект та збережіть його: модулю Unit1.cpp надайте ім’я Timer.cpp, а файлу проекту Project1.bpr – ім’я Colori. bpr.
Помістіть на форму компонент Button (укладка Standard), компонент CheckBox (укладка Standard), компонент ColorDialog (укладка Dialogs), компонент Timer (укладка System) та компонент SpinEdit (укладка Samples).
Розташування компонентів показано на рис. 1:
Рис. 1.
Встановіть властивості компонентів згідно таблиці:
Компонент | Name | Властивість | Значення |
Form1 | FormMain | Caption | Canvas |
Color | clBlack | ||
Height | |||
Width | |||
Button1 | Button1 | Caption | Select Color |
Anchors ->akTop | true | ||
Anchors ->akRight | true | ||
CheckBox1 | CheckBox1 | Caption | Revers |
Font->Color | clWhite | ||
Color | clBlack | ||
Anchors ->akTop | true | ||
Anchors ->akRight | true | ||
Timer1 | Timer1 | Interval | |
SpinEdit1 | СSpinEdit1 | Increment | |
MaxValue | |||
MinValue | |||
Value | |||
Anchors ->akTop | true | ||
Anchors ->akRight | true | ||
ColorDialog1 | ColorDialog1 |
Форма буде матиме вигляд як на рис. 2:
Рис. 2.
Збережіть проект.
У заголовному файлі Timer.h пропишіть константи, змінні та функції, які будуть використані у вашій програмі: //--------------------------------------------------
const int MaxPoints = 15;
struct TRPoint { float X, Y; };
class TFormMain : public TForm {
__published: // IDE-managed Components
private: // User declarations
TRPoint Points[MaxPoints];
float Rotation; // у радіанах
int PointCount;
void __fastcall RotatePoints();
public: // User declarations
__fastcall TFormMain (TComponent* Owner);
};
//------------------------------------------------
У файл Timer.cpp додайте директиву #include <math.h> та опис оголошеної функції: //-------------------------------------------------------
void __fastcall TFormMain::RotatePoints()
{
int RN=8; // all figures are in radians
const float M_2PI = 2 * M_PI;
float StepAngle = M_2PI / PointCount;
if (!CheckBox1->Checked) Rotation += M_PI / RN;
if (CheckBox1->Checked) Rotation -= M_PI / RN;
if (Rotation > StepAngle) Rotation -= StepAngle;
int i;
float j;
for (i = 0, j = Rotation; i < PointCount; i++, j += StepAngle)
{
Points[i].X = cos(j);
Points[i].Y = sin(j);
}
}
//------------------------------------------------------
Активуйте форму FormMain та створіть для неї оброблювач події OnCreate: //-------------------------------------------------------
void __fastcall TFormMain::FormCreate(TObject *Sender)
{
Canvas->Pen->Color = clTeal;
Rotation = 0;
PointCount = MaxPoints;
RotatePoints();
}
//-------------------------------------------------------
Активуйте форму FormMain та створіть для неї оброблювач події OnPaint: //------------------------------------------------------
void __fastcall TFormMain::FormPaint(TObject *Sender)
{
int radius;
int centerX = ClientWidth / 2;
int centerY = ClientHeight / 2;
if (centerX < centerY)
radius = centerX;
else radius = centerY;
Canvas->Ellipse(0, 0, radius*2, radius*2);
int i, j;
for (i = 0; i < PointCount; i++)
{
for (j = i + 1; j < PointCount; j++)
{
Canvas->MoveTo(radius + float(Points[i].X * radius), radius + float(Points[i].Y * radius));
Canvas->LineTo(radius + float(Points[j].X * radius), radius + float(Points[j].Y * radius));
}
}
}
//------------------------------------------------------
Активуйте форму FormMain та створіть для неї оброблювач події OnResize: //--------------------------------------------------------
void __fastcall TFormMain::FormResize(TObject *Sender)
{
Invalidate();
}
//--------------------------------------------------------
Активуйте компонент Timer1 та створіть для нього оброблювач події OnTimer: //-------------------------------------------------------
void __fastcall TFormMain::Timer1Timer(TObject *Sender)
{
RotatePoints();
Invalidate();
}
//-------------------------------------------------------
Активуйте компонент CSpinEdit1 та створіть для нього оброблювач події OnChange: //------------------------------------------------------------
void __fastcall TFormMain::CSpinEdit1Change(TObject *Sender)
{
Timer1->Interval=CSpinEdit1->Value;
}
//-------------------------------------------------------------
Активуйте кнопку Button1 та створіть для неї оброблювач події OnClick: //--------------------------------------------------------
void __fastcall TFormMain::Button1Click(TObject *Sender)
{
if (ColorDialog1->Execute())
Canvas->Pen->Color = ColorDialog1->Color;
}
//--------------------------------------------------------
Збережіть проект.
Запустіть програму на виконання. Вікно Вашого проекту матиме вигляд як на рис. 3:
Рис. 3.
Контрольні питання
1. Назвіть основні властивості класу ТCanvas.
2. Назвіть основні методи класу ТCanvas.
3. Коли виникає подія OnResize форми?
4. Яка подія забезпечує виведення графіки на поверхню форми?
5. Яке призначення методу Invalidate()?