Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Господа, нужна реальная помощь! / 16 сообщений из 16, страница 1 из 1
22.06.2006, 12:19
    #33808228
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
создаю ActiveX (+прил. VС++6). так вот об ActiveX:
делаю часы. первый ActiveX, поэтому маленько ещё не доганяю что к чему
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
void CMCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{ ...
char CurrentTime[ 30 ] ;
struct tm *newtime;
long Time1;     
time( &Time1);
newtime=localtime(&Time1);
strcpy(CurrentTime, asctime(newtime));
CurrentTime[ 24 ]=' '; 
CurrentTime[ 25 ] =  0 ;
pdc->ExtTextOut(rcBounds.left,rcBounds.top, ETO_CLIPPED, rcBounds, 
	CurrentTime, strlen(CurrentTime), NULL);
}
//---------------------------
int CMyClockCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (COleControl::OnCreate(lpCreateStruct) == - 1 ) return - 1 ;
SetTimer(  1 , (UINT)m_updateInterval, NULL );
return  0 ;
}
//----------------------------
void CMyClockCtrl::OnTimer(UINT nIDEvent) 
{
InvalidateControl();
COleControl::OnTimer(nIDEvent);
}
этот код работает прекрасно: он исходя из системного времени выводит на экран свое
НО: мне нужно чтобы не было привязки к системному времени. чтобы отсчет начинался с устаноленного в программе времени. в самом проекте на VC я получаю строку начального времени вида:
Код: plaintext
m_str=str;
где str соответственно например "12:34:56"
ВОПРОС: ГДЕ нужно изменить и ЧТО чтобы отсчет начался с этого значения и что бы не обращалось внимание на системное время?
нужно изменить только в OnDraw? или ещё где-то?
если кто знает, не откажите в помощи пажалуста!
Заранее спасибо всем откликнувшимся!
...
Рейтинг: 0 / 0
22.06.2006, 13:44
    #33808624
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
Нужно в OnCreate брать время time( &Time1) один раз,
затем увеличивать по таймеру.
А в OnDraw только выводить значение.
PS проблема только в том, что таймер необязательно будет срабатывать,
например, 1 раз в секунду, может 1.0001 с.
В таймере можно использовать различие между текущим и
предыдущим значениями, например под виндой можно использовать
GetTickСount
...
Рейтинг: 0 / 0
22.06.2006, 14:05
    #33808730
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
а если можно, напишите конкретно что надо написать
...
Рейтинг: 0 / 0
22.06.2006, 15:54
    #33809196
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
Что-то вроде (если по простому):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
void CMCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{ ...
char CurrentTime[ 30 ] ;
struct tm *newtime;
newtime=localtime(&Time1);
strcpy(CurrentTime, asctime(newtime));
CurrentTime[ 24 ]=' '; 
CurrentTime[ 25 ] =  0 ;
pdc->ExtTextOut(rcBounds.left,rcBounds.top, ETO_CLIPPED, rcBounds, 
	CurrentTime, strlen(CurrentTime), NULL);
}


int CMyClockCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (COleControl::OnCreate(lpCreateStruct) == - 1 ) return - 1 ;
time( &Time1); // Time1 - глобальный
SetTimer(  1 , (UINT)m_updateInterval, NULL );
SetTimer(  2 ,  1000 , NULL ); // раз в секунду срабатывает
return  0 ;
}

void CMyClockCtrl::OnTimer(UINT nIDEvent) 
{
if (nIDEvent== 2 ) {Time1++;}
InvalidateControl();
COleControl::OnTimer(nIDEvent);
}

...
Рейтинг: 0 / 0
22.06.2006, 15:54
    #33809197
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
я не понял: как в OnCreate брать время time( &Time1) один раз, а
затем увеличивать по таймеру ?
...
Рейтинг: 0 / 0
22.06.2006, 16:04
    #33809242
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
Да, взять один раз время и увеличивать каждую секунду.
Тогда счетчик будет независим от системных часов.
Но гарантии, что OnTimer будет срабатывать 1 раз в с нет.
а что непонятно-то?
...
Рейтинг: 0 / 0
22.06.2006, 16:04
    #33809245
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
ой, я не видел ответ, сейчас попробую...
...
Рейтинг: 0 / 0
22.06.2006, 16:21
    #33809333
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
я всё это написал, при тестировании отдельно от проекта ActiveX работает так же - то есть показывает системное время.
у меня есть вопрос: как передать сформированную строку строкового типа из проекта в ActiveX?
...
Рейтинг: 0 / 0
22.06.2006, 16:43
    #33809415
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
кажется понял, сейчас попробую сделать. если не получится, то можно ещё спрошу? :)
...
Рейтинг: 0 / 0
22.06.2006, 17:32
    #33809616
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
сделал я что бы в моем ActiveX выводилась ещё и строка из VC (напр: "12:34:45")
сейчас пока мой метод OnDraw имеет вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
char CurrentTime[ 30 ] ;
struct tm *newtime;
time(&Time1);	 
newtime=localtime(&Time1);
strcpy(CurrentTime, asctime(newtime));
CurrentTime[ 24 ]=' ';
CurrentTime[ 25 ] =  0 ;     
pdc->ExtTextOut(rcBounds.left,rcBounds.top, ETO_CLIPPED, rcBounds, 
		CurrentTime, strlen(CurrentTime), NULL);
TEXTMETRIC tm;
CString strCaption = GetText();
pdc->GetTextMetrics(&tm);
pdc->ExtTextOut((rcBounds.left + rcBounds.right)/ 2 ,(rcBounds.top + rcBounds.bottom - tm.tmHeight)/ 2 ,ETO_CLIPPED, rcBounds, strCaption, strCaption.GetLength(),NULL);
сейчас всё выводится в кучу - тикает текущее системное время и рядом показывается строка которую по нормальному нужно использовать в качестве отсчета.
теперь вопрос. что нужно изменить в этом OnDraw (я так понимаю что имено в нем у меня загвоздка), что бы отсчитывалось начиная с этой строки и кстати, мне совсем не нужно что бы показывался год, месяц, дата. мне просто нужно время. как подреставрировать мой код?
...
Рейтинг: 0 / 0
22.06.2006, 17:47
    #33809687
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
Время можно получить, например, так
Код: plaintext
1.
sprintf(buf,"%02d:%02d:%02d",newtime->tm_hour,newtime->tm_min,newtime->tm_sec);
...
Рейтинг: 0 / 0
22.06.2006, 17:50
    #33809698
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
написал вместо:
Код: plaintext
strcpy(CurrentTime, asctime(newtime));
Код: plaintext
strcpy(CurrentTime, strCaption);
стало выводиться две одинаковые строки, только то что должно было работать часами, менять значение не хочет. что ещё куда нужно дописать что бы часы заработали?
...
Рейтинг: 0 / 0
22.06.2006, 17:54
    #33809720
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
ну это если просто на С++ пишешь. а мне то надо именно через activex и VC сделать
...
Рейтинг: 0 / 0
22.06.2006, 18:21
    #33809826
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
так как мне сделать чтобы отсчет пошел с этой строки? и время менялось?
...
Рейтинг: 0 / 0
22.06.2006, 18:34
    #33809852
Maksim UM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
Для получения времени из строки можно использовать функцию
strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);
...
Рейтинг: 0 / 0
22.06.2006, 19:06
    #33809916
el'f
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Господа, нужна реальная помощь!
ну получу я это значение, а будет ли оно меняться каждую секунду? или что то все таки в обработчике переделывать нужно?

кстати, на строке
Код: plaintext
strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);
error: strptime неизвестный идентификатор. библиотека time.h подключена
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Господа, нужна реальная помощь! / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]