Наша следующая задача – нарисовать анимированные стрелки. Алгоритм прост – каждую секунду перерисовываем часы с новым показанием стрелок.
Сначала нарисуем стрелки. Нам нужно нарисовать несколько стрелок разной длины и толщины, для этого напишем функцию:
#define M_PI 3.14159265358979323846
void drawArrow(Graphics * graphics,x0, int y0, double angle,
int len, int width, const Color & color)
{
Pen pen(color, width);
graphics->DrawLine(&pen, x0, y0, x0+int(len*sin(angle)),
y0-int(len*cos(angle)));
}
Как видите, не сложно. Попробуйте нарисовать пару стрелок, задавая разные параметры.
Получилось? Необходимо теперь получить системное время и выделить количество часов и минут. Для этого будем использовать функцию GetLocalTime() стандартной библиотеки. ПреобразуемфункциюmyDraw() следующимобразом:
void myDraw(const HDC & hdc)
{
constint x = 10;
constint y = 10;
constint radius = 100;
constdouble hour_arrow_length = radius*0.6;
constdouble min_arrow_length = radius*0.8;
constdouble sec_arrow_length = radius*0.9;
const Color hour_arrow_color(255,0,0,0);
const Color min_arrow_color(255,0,0,255);
const Color sec_arrow_color(255,255,0,0);
Color clock_border_color(255,0,0,255);
Color clock_background_color(255,255,200,255);
|
|
int c_x = x+radius;
int c_y = y+radius;
Graphics graphics(hdc);
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
Pen pen(clock_border_color, 2);
SolidBrush brush(clock_background_color);
graphics.FillEllipse(&brush, x, y, 2*radius, 2*radius);
graphics.DrawEllipse(&pen, x, y, 2*radius, 2*radius);
SYSTEMTIME st;
GetLocalTime(&st);
int hour = st.wHour;
int min = st.wMinute;
//int sec = st.wSecond;
//int msec = st.wMilliseconds;
if (hour >= 12) hour -= 12;
drawArrow(&graphics, c_x, c_y, 2*M_PI*hour/12.0,
hour_arrow_length, 3, hour_arrow_color);
drawArrow(&graphics, c_x, c_y, 2*M_PI*min/60.0,
min_arrow_length, 2, min_arrow_color);
}