Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум ОА Цымбалюк.doc
Скачиваний:
21
Добавлен:
29.08.2019
Размер:
2 Мб
Скачать
☆

Задание №11. Часы

Цель занятия: Научиться рисовать графические изображения на форме

Студенты должны знать: модули для работы с датой и временем

уметь: подключать модули для работы с датой и временем, программировать приложение Часы

Задание.

  1. Выберите в меню Пуск – Программы - CodeGear RAD Studio2009 C++Builder 2009

  2. Создание новое приложение (File – New – VCL Forms Application).

    1. Проектирование интерфейса приложения.

      1. Переименуйте название формы на Часы.

      2. Добавьте компонент Timer1 на приложение.

    2. Программирование приложения

      1. Включите модули для работы с датой и временем, а также с математическими функциями после строки #include "Unit1.h"

#include "DateUtils.hpp"

#include "math.h"

      1. Опишите переменные

int x0, y0;

Int ahr, amin, asec;

#define R 100

      1. Напишите программный код в конструкторе формы:

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

TDateTime t;

ClientHeight=(R+30)*2; //задание размера формы в соответствии с размером циферблата

ClientWidth=(R+30)*2;

x0=R+30;

y0=R+30;

t=Now(); //текущее время

ahr=90-HourOf(t)*30-(MinuteOf(Today())/12)*6; //Определение положения стрелок

amin=90-MinuteOf(t)*6;

asec=90-SecondOf(Today())*6;

Timer1->Interval=1000; //период сигнала от таймера 1 секунда

Timer1->Enabled=true; //пуск таймера

}

      1. Перейдите на модуль Unit1.h. Измените описание класса TForm1: добавьте описание двух процедур:

class TForm1 : public TForm

{

__published: // IDE-managed Components

TTimer *Timer1;

void __fastcall DrawClock(void);

void __fastcall Vector(int x0,int y0,int a,int l);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

      1. Напишите процедуру для рисования линии (стрелок):

void __fastcall TForm1::Vector(int x0,int y0,int a,int l)

{

#define TORAD 0.0174532 //коофициент перерасчёта угла из градусов в радианы

int x,y;

Canvas->MoveTo(x0,y0);

x=x0+l*cos(a*TORAD);

y=y0-l*sin(a*TORAD);

Canvas->LineTo(x,y);

}

      1. Напишите процедуру для изображения стрелок:

void __fastcall TForm1::DrawClock(void)

{

TDateTime t;

Canvas->Pen->Color=clBtnFace; //стереть изображение стрелок

Canvas->Pen->Width=3

Vector(x0,y0,ahr,R-20); ; //часовую

Vector(x0,y0,amin,R-15); //минутную

Vector(x0,y0,asec,R-7); //секундную

t=Now();

ahr=90-HourOf(t)*30-(MinuteOf(t)%12)*6; //новое положение стрелок

amin=90-MinuteOf(t)*6;

asec=90-SecondOf(t)*6;

Canvas->Pen->Width=3; //нарисовать стрелки

Canvas->Pen->Color=clBlack;

Vector(x0,y0,ahr,R-20);

Canvas->Pen->Width=2;

Canvas->Pen->Color=clBlack;

Vector(x0,y0,amin,R-15);

Canvas->Pen->Width=1;

Canvas->Pen->Color=clYellow;

Vector(x0,y0,asec,R-7);

}

      1. Напишите процедуру для прорисовки циферблата на событие onPaint для формы Form1:

void __fastcall TForm1::FormPaint(TObject *Sender) //прорисовка циферблата

{

int x, y;

int a;

int h;

TBrushStyle bs;

TColor pc;

int pw;

bs=Canvas->Brush->Style;

pc=Canvas->Pen->Color;

pw=Canvas->Pen->Width;

Canvas->Brush->Style=bsClear;

Canvas->Pen->Width=1;

Canvas->Pen->Color=clBlack;

a=0;

h=3;

while (a<360)

{

x=x0+R*cos(a*TORAD);

y=x0-R*sin(a*TORAD);

Form1->Canvas->MoveTo(x,y);

if ((a%30)==0)

{

Canvas->Ellipse(x-2,y-2,x+3,y+3);

x=x0+(R+15)*cos(a*TORAD);

y=x0-(R+15)*sin(a*TORAD);

Canvas->TextOut(x-5,y-7,IntToStr(h));

h--;

if (h==0)

h=12;

}

else

Canvas->Ellipse(x-1,y-1,x+1,y+1);

a=a+6;

}

Canvas->Brush->Style=bs;

Canvas->Pen->Width=pw;

Canvas->Pen->Color=pc;

DrawClock();

}

      1. Напишите процедуру для сигнала от таймера: