![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 02.01.2008
Сообщений: 21
|
![]()
Излагаю суть проблемы. Мне нужно написать часы на на языке С. Вроде бы я уже все сделал, но проблема в том что я не могу организовать цикл ,при котором эти часы ходили бы. При некоторых экспериментах я все-таки добился своего, но тогда он зацикливается и хана. Надо учитывать что вверху есть еще меню. И через эти зацикливания оно ваще исчезает. Надо специально нажать кнопку, что б стрелки встали в новую позицию( время считывается с винды). То же самое могу сказать и про электронный вариант часов. Помогите пожалуйста.
Ниже исходник функции, которая рисует аналоговые часы, а также функция мейн. //нарисовать часы void DrawAnalog(int x,int y,int w,int h) { MySetFGColor(3); MySetBGColor(0); MyDrawEllipse(x,y,w,h); //рисуем основу int cx=x+w/2; int cy=y+h/2; //стрелки (cos-x, sin-y) циферблата for(int i=0;i<360;i+=360/12) { MyDrawLine(cx+cos(i/180.0f*3.14f)*w/20.0f*9.0f,cy+sin(i/180.0f*3.14f)*h/20.0f*9.0f, cx+cos(i/180.0f*3.14f)*w/2.0f,cy+sin(i/180.0f*3.14f)*h/2.0f); } //считываем время time_t ltime; time(<ime); tm *now=localtime(<ime); char Date[32]={0}; int DateW=w/4,DateH=h/8; sprintf(Date, "%02d.%02d",now->tm_mday,1+now->tm_mon); MySetFGColor(3); MySetBGColor(0); MyDrawRect(x+w/4.0*3.0-DateW/2,y+(h-DateH)/2,DateW,DateH); //фон для даты MyDrawText(x+w/4.0*3.0-DateW/2,y+(h-DateH)/2,Date); //data //стрелки //hour MySetFGColor(1); MyDrawLine(cx,cy, cx+cos(now->tm_hour/12.0*3.14*2-0.5*3.14)*w/2.0, cy+sin(now->tm_hour/12.0*3.14*2-0.5*3.14)*h/2.0); // Minute MySetFGColor(2); MyDrawLine(cx,cy, cx+cos(now->tm_min/60.0*3.14*2-0.5*3.14)*w/2.0, cy+sin(now->tm_min/60.0*3.14*2-0.5*3.14)*h/2.0); // Second MySetFGColor(4); MyDrawLine(cx,cy, cx+cos(now->tm_sec/60.0*3.14*2-0.5*3.14)*w/2.0, cy+sin(now->tm_sec/60.0*3.14*2-0.5*3.14)*h/2.0); if(Sound) //если звук включен { static int LastSec=0; if(LastSec!=now->tm_sec) //и изменилась секунда { printf("\a\a"); //бипаем LastSec=now->tm_sec; } } } void main() { if(!MyInitGraph()) //initialization { printf("Error"); getch(); return; } while(1) { MyDrawWindow("Main Window"); //рисуем окно MyDrawButton(10,45,100,25, "(1) Settings"); MyDrawButton(10,75,100,25, "(2) Exit"); MyDrawText(10,95, "Press any key to update clock"); int w=atoi(ClockW), h=atoi(ClockH); int x=120+(WndW-130-w)/2, y=45+(WndH-55-h)/2; if(Analog) { DrawAnalog(x,y,w,h);} //аналоговый вариант else {DrawDigital(x,y,w,h); //электронный } switch(getch()) { case '1' : ShowSettings(); break; case '2' : return; } } } Надеюсь на вашу помощь. |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 06.06.2008
Сообщений: 105
|
![]() Код:
Код:
И совет - добавь sleep(15); в конец цикла хотябы.. А то часы, жрущие 100% проца - не радуют) |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 02.01.2008
Сообщений: 21
|
![]()
Ооо все класно теперь большущее спасибо)
только вот там еще delay(1000) после DrawAnalog(x,y,w,h); //аналоговый вариант надо добавить. А то мигает так, что мама не горюй) у меня есть еще один вопрос как сделать так что бы и часовая стрелка перемещалась понемногу, а то у меня только с полоски циферблата на другую полоску (то есть один раз в час). Вот в этом куске (тут вместе с минутной и секундной) //hour MySetFGColor(1); MyDrawLine(cx,cy, cx+cos(now->tm_hour/12.0*3.14*2-0.5*3.14)*w/2.0, cy+sin(now->tm_hour/12.0*3.14*2-0.5*3.14)*h/2.0); // Minute MySetFGColor(2); MyDrawLine(cx,cy, cx+cos(now->tm_min/60.0*3.14*2-0.5*3.14)*w/2.0, cy+sin(now->tm_min/60.0*3.14*2-0.5*3.14)*h/2.0); // Second MySetFGColor(4); MyDrawLine(cx,cy, cx+cos(now->tm_sec/60.0*3.14*2-0.5*3.14)*w/2.0, cy+sin(now->tm_sec/60.0*3.14*2-0.5*3.14)*h/2.0); Я приблизительно такое нашел в одной книжке и переделал. Но вот с часовой стрелкой проблемы. Пробовал изменить кое-какие параметры, но к сожелению безрезультатно. Она ваще в другую сторону разворачивалась. Подскажи плз если знаешь. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 06.06.2008
Сообщений: 105
|
![]()
Мм - когда считаешь угол отклонения часовой стрелки
a = (2 * PI / 12) * Hour; // Hour - от 1 до 12 Нужно добавить угол b такой b = (2 * PI / 12) / 60 * Minute; // Minute - кол-во минут. |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 02.01.2008
Сообщений: 21
|
![]()
ну суть то я вроде бы понял, но как мне это переделать в этом куске
MyDrawLine(cx,cy, cx+cos(now->tm_hour/12.0*3.14*2-0.5*3.14)*w/2.0, cy+sin(now->tm_hour/12.0*3.14*2-0.5*3.14)*h/2.0); Если не тяжело то напиши плз Заранее благодарен |
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 06.06.2008
Сообщений: 105
|
![]()
MyDrawLine(cx,cy,
cx+cos(now->tm_hour/12.0*3.14*2-0.5*3.14 + now->tm_minute / 12 / 60 * 3.14 * 2)*w/2.0, cy+sin(now->tm_hour/12.0*3.14*2-0.5*3.14 + now->tm_minute / 12 / 60 * 3.14 * 2)*h/2.0); Вроде так Вопрос только - для чего у тебя в формуле " -0.5 * 3.13" ? |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 02.01.2008
Сообщений: 21
|
![]()
неа к сожалению не канает
без этого " -0.5 * 3.13" стрелка оказывается не там где надо ваще может есть еще какие то идеи? а то обидно, что все пашет , а эта стрелка не сдвигается как надо(( |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 02.01.2008
Сообщений: 21
|
![]()
все кароче
все сделал спасибо за помощь тема закрыта |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите при написании WebBrowser | kuzmich | Компоненты Delphi | 17 | 15.12.2007 18:58 |
помогите в написании одной програмки | Илюха | Общие вопросы Delphi | 17 | 12.10.2007 07:55 |
помогите в написании игры | steck | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 7 | 29.04.2007 07:50 |
Иконка у часов | Lonix | Безопасность, Шифрование | 4 | 03.04.2007 22:49 |