Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2008, 00:29   #1
Black_Ak24
Пользователь
 
Регистрация: 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(&ltime);
tm *now=localtime(&ltime);

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;
}
}
}

Надеюсь на вашу помощь.
Black_Ak24 вне форума Ответить с цитированием
Старый 11.06.2008, 00:45   #2
Olympian
Форумчанин
 
Аватар для Olympian
 
Регистрация: 06.06.2008
Сообщений: 105
По умолчанию

Код:

switch(getch())
{ case '1' : ShowSettings();
break;
case '2' :
return;
}
Правильно - у тебя цикл while дошел до сюда и ждет, пока нажмешь кнопку Попробуй так
Код:

if (kbhit())
switch(getch())
{ case '1' : ShowSettings();
break;
case '2' :
return;
}
Должно быть так - он дойдет до ифа, если нажималась кнопка - то он войдет в иф, иначе - проигнорит и пойдет перерисовывать.
И совет - добавь
sleep(15);
в конец цикла хотябы.. А то часы, жрущие 100% проца - не радуют)
Olympian вне форума Ответить с цитированием
Старый 11.06.2008, 02:18   #3
Black_Ak24
Пользователь
 
Регистрация: 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);

Я приблизительно такое нашел в одной книжке и переделал. Но вот с часовой стрелкой проблемы. Пробовал изменить кое-какие параметры, но к сожелению безрезультатно. Она ваще в другую сторону разворачивалась. Подскажи плз если знаешь.
Black_Ak24 вне форума Ответить с цитированием
Старый 11.06.2008, 11:26   #4
Olympian
Форумчанин
 
Аватар для Olympian
 
Регистрация: 06.06.2008
Сообщений: 105
По умолчанию

Мм - когда считаешь угол отклонения часовой стрелки

a = (2 * PI / 12) * Hour; // Hour - от 1 до 12

Нужно добавить угол b такой

b = (2 * PI / 12) / 60 * Minute; // Minute - кол-во минут.
Olympian вне форума Ответить с цитированием
Старый 11.06.2008, 14:38   #5
Black_Ak24
Пользователь
 
Регистрация: 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);

Если не тяжело то напиши плз
Заранее благодарен
Black_Ak24 вне форума Ответить с цитированием
Старый 11.06.2008, 15:55   #6
Olympian
Форумчанин
 
Аватар для Olympian
 
Регистрация: 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" ?
Olympian вне форума Ответить с цитированием
Старый 11.06.2008, 17:04   #7
Black_Ak24
Пользователь
 
Регистрация: 02.01.2008
Сообщений: 21
По умолчанию

неа к сожалению не канает
без этого " -0.5 * 3.13" стрелка оказывается не там где надо ваще
может есть еще какие то идеи?
а то обидно, что все пашет , а эта стрелка не сдвигается как надо((
Black_Ak24 вне форума Ответить с цитированием
Старый 12.06.2008, 10:24   #8
Black_Ak24
Пользователь
 
Регистрация: 02.01.2008
Сообщений: 21
По умолчанию

все кароче
все сделал
спасибо за помощь
тема закрыта
Black_Ak24 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите при написании 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