Новый участник
Сообщения: 3
Благодарности: 0
|
Профиль
|
Сайт
|
Отправить PM
| Цитировать
Здравствуйте. Вот программа, реализующая работу часов. Подскажите пожалуйста, что нужно добавить, чтобы был выбор часового пояса? Заранее спасибо.
Код:
#include <graphics.h> // заголовочный файл графического режима Borland Graphics Interface
#include <cmath> // заголовочный файл для простых математических операций
#include <ctime> // заголовочный файл для простых математических операций
#include <conio.h> // заголовочный файл для функции getch () и kbhit ()
unsigned char cx, cy; // объявление переменных cx и cy, которые будут соответствовать координатам центральной точки окна
unsigned char radius=100; // объявление переменной radius, которая определяет размер часов
unsigned char pos=1; // текущая позиция в меню
void menu() // процедура рисования меню
{
cleardevice(); // очистка экрана
setcolor(COLOR(255,0,0)); // установка дальнейшего цвета для рисования в палитре RGB (255.0.0 - красный)
settextstyle(DEFAULT_FONT,HORIZ_DIR,4); // DEFAULT_FONT - установление стандартного шрифта, HORIZ_DIR - горизонтальное направление текста, 4 - размер шрифта
outtextxy(20, 20, "СТРЕЛОЧНЫЕ"); // рисование текста "стрелочные" с координатами x = 20 y = 20
setcolor(COLOR(0,0,255));
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,3);
outtextxy(143, 40, "ЧАСЫ");
setcolor(COLOR(255,255,0));
outtextxy(300, 55, "1.0");
setcolor(LIGHTGRAY);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(70, 100, "Открыть часы");
outtextxy(70, 150, "О программе...");
outtextxy(70, 200, "Выход");
if(pos==4) // если пользователь вышел за пределы меню вниз ...
{
pos=1; // ... возвращаемся на первую позицию меню
};
if(pos==0) // если пользователь вышел за пределы меню вверх ...
{
pos=3; // ... возвращаемся на последнюю позицию меню
};
switch(pos) // оператор выбора текущего положения в меню
{
case 1:
setcolor(COLOR(255,255,255));
outtextxy(70, 100, "Открыть часы");
break;
case 2:
setcolor(COLOR(255,255,255));
outtextxy(70, 150, "О программе...");
break;
case 3:
setcolor(COLOR(255,255,255));
outtextxy(70, 200, "Выход");
break;
}
}
void menu_about() // процедура вывода меню "О программе ..."
{
cleardevice(); // очистка экрана
setcolor(COLOR(255,0,0));
settextstyle(DEFAULT_FONT,HORIZ_DIR,4);
outtextxy(20, 20, "СТРЕЛОЧНЫЕ");
setcolor(COLOR(0,0,255));
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,3);
outtextxy(143, 40, "ЧАСЫ");
setcolor(COLOR(255,255,0));
outtextxy(300, 55, "1.0");
setcolor(LIGHTGRAY);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(40, 130, "11111");
outtextxy(40, 150, "Copyright © ");
outtextxy(40, 170, "КБ-12-1");
getch(); // функция ожидания нажатия клавиши
menu(); // рисование меню
}
void display(unsigned char radius) // процедура рисования часов (циферблата)
{
setcolor(COLOR(255,255,255));
circle(cx, cy, radius+25); // рисование внешних колец часов (корпус)
circle(cx, cy, radius+23);
setcolor(COLOR(0,255,0));
unsigned int angle; // объявление переменной для хранения угла
for (angle=0; angle<360; angle+=30) // цикл рисования часовых точек
{
circle(cx+radius*cos(angle*M_PI/180),
cy+radius*sin(angle*M_PI/180),
2);
}
for(angle=0; angle<360; angle+=6) // цикл рисования секундных точек
{
putpixel(cx+radius*cos(angle*M_PI/180),
cy+radius*sin(angle*M_PI/180),
COLOR(255,255,0));
}
}
void get_time(unsigned char *h, unsigned char *m, unsigned char *s) // процедура для получения текущего времени
{
time_t rawtime; // создаем объект по типу структуры time_t, с именем rawtime
time(&rawtime); // записываем в объект rawtime результат ф-й time (ф-я time возвращает кол-во секунд от 1970г.)
tm *timeinfo; // объявляем указатель * timeinfo, который будет указывать на область памяти с типом данных tm
timeinfo = localtime(&rawtime); // присваиваем указателю * timeinfo адрес, который возвращает ф-я localtime (), которая преобразует количество секунд в структуре типа t_time в структуру типа tm, в которой в качестве полей содержатся целочисленные значения секунд, минут, часов и возвращает адрес на заполненную структуру tm текущим временем
*h=timeinfo->tm_hour; // присваиваем переменной hour (через указатель h) значение поля tm_hour в структуре типа tm
*m=timeinfo->tm_min; // присваиваем переменной minute (через указатель h) значение поля tm_min в структуре типа tm
*s=timeinfo->tm_sec; // присваиваем переменной second (через указатель h) значение поля tm_sec в структуре типа tm
}
void needle(unsigned char h, unsigned char m, unsigned char s) // процедура для анимации секундной стрелки
{
/** Зарисовывают исходное положение стрелок черным цветом **/
setcolor(0);
line(cx,cy, // начальные координаты линии x и y (из центра экрана) для рисования секундной стрелки
cx+(radius-10)*cos( ((s*6-6)-90) * M_PI/180 ), // конечная координата x
cy+(radius-10)*sin( ((s*6-6)-90) * M_PI/180 )); // конечная координата y
line(cx,cy, // начальные координаты линии x и y (из центра экрана) для рисования минутной стрелки
cx+(radius-20)*cos( ((m*6-6)-90) * M_PI/180 ), // конечная координата x
cy+(radius-20)*sin( ((m*6-6)-90) * M_PI/180 )); // конечная координата y
line(cx,cy, // начальные координаты линии x и y (из центра экрана) для рисования часовой стрелки
cx+(radius-(radius/2))*cos( ((h*30-30)-90+(m/2-0.5)) * M_PI/180 ), // конечная координата x
cy+(radius-(radius/2))*sin( ((h*30-30)-90+(m/2-0.5)) * M_PI/180 )); // конечная координата y
/** Конец ------------------------------------------------- **/
/** Определяем координаты и рисуем стрелки часов **/
setcolor(COLOR(0,0,255));
line(cx,cy, // начальные координаты линии x и y (из центра экрана) для рисования секундной стрелки
cx+(radius-10)*cos( ((s*6)-90) * M_PI/180 ), // конечная координата x
cy+(radius-10)*sin( ((s*6)-90) * M_PI/180 )); // конечная координата y
setcolor(COLOR(255,255,0));
line(cx,cy, // начальные координаты линии x и y (из центра экрана) для рисования минутной стрелки
cx+(radius-20)*cos( ((m*6)-90) * M_PI/180 ), // конечная координата x
cy+(radius-20)*sin( ((m*6)-90) * M_PI/180 )); // конечная координата y
setcolor(COLOR(255,0,0));
line(cx,cy, // начальные координаты линии x и y (из центра экрана) для рисования часовой стрелки
cx+(radius-(radius/2))*cos( ((h*30)-90+(m/2)) * M_PI/180 ), // конечная координата x
cy+(radius-(radius/2))*sin( ((h*30)-90+(m/2)) * M_PI/180 )); // конечная координата y
/** Конец ------------------------------------------------- **/
}
void open_clock() // процедура вызова часов
{
cleardevice(); // очистка экрана
cx=getmaxx()/2; // определения координаты x, для центральной точки окна
cy=getmaxy()/2; // определения координаты y, для центральной точки окна
display(radius); // вызов процедуры для рисования часов (циферблата)
unsigned char hour, minute, second; // объявление переменных для сохранения текущего времени
while(!kbhit())
{
get_time(&hour,&minute,&second); // вызов процедуры для получения текущего времени
needle(hour,minute,second); // вызов процедуры рисования стрелок с параметрами текущего времени
setcolor(COLOR(255,255,255));
circle(cx,cy,2); // рисуем маленькую точку по центру часов, поверх стрелок
delay(250); // задержка в 250 мс (цикл обновляется 4 раза в секунду)
}
menu(); // рисование меню
}
int main() // главная программа
{
initwindow(400, 300); // инициализация окна для графического режима (400x300 пикселей)
menu(); // рисование меню
unsigned char key; // объявление переменной для хранения кода нажатой клавиши
while(key!=27) // цикл работы программы, пока не нажата клавиша Esc
{
key=getch(); // присвоение переменной key кода нажатой клавиши
switch(key) // оператор выбора нажатой клавиши
{
case 72: // если нажата клавиша "вверх"
pos--; // меняем позицию меню на одну вверх
menu(); // рисуем меню уже с новой активной позицией
break;
case 80: // если нажата клавиша "вниз"
pos++; // меняем позицию меню на одну вниз
menu(); // рисуем меню уже с новой активной позицией
break;
case 13: // если нажата клавиша Enter
switch(pos) // оператор выбора позиции меню
{
case 1: // если позиция 1 (Открыть часы)
open_clock(); // вызов процедуры рисования часов
break;
case 2: // если позиция 2 (О программе ...)
menu_about(); // вызов процедуры рисования меню "О программе ..."
break;
case 3: // если позиция 3 (Выход)
closegraph(); // закрытие графического режима
return 0; // возврат значения 0 главной программы (закрытие)
}
}
}
}
|