Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > таймер в OCX


Автор: -Sman- 11.11.2005, 13:58
Собстно - сам вопрос в сабже.
Есть некий activeX (неоконный). В него надо добавить таймер. Но ведь для таймера используется static CALLBACK процедура. Из нее можно получить доступ к объектам класса? И есть ли хендл (HWND) у ocx?
Понимаю - вопросы глуповатые..но все же - помогите разобраться...

Автор: Dray 17.11.2005, 23:36
Цитата(Sman @ 11.11.2005, 13:58)
И есть ли хендл (HWND) у ocx?

Например в VC++ при использовании библиотеки ATL можно выбирать флажком при создании компанента будет ли он оконным или нет. Можно использовать функцию API SetTimer.
Цитата

UINT_PTR SetTimer(          HWND hWnd,
    UINT_PTR nIDEvent,
    UINT uElapse,
    TIMERPROC lpTimerFunc
);

В первый параметр можно подстасить NULL, тогда второй будет игнорироваться.

Автор: SeregaLBN 13.12.2005, 18:01
можно использовать QueueUserWorkItem
или мультимедиа таймер - timeSetEvent

но в этих обоих примерах - модуль должен собираться как многопоточный
PS: ф-ция QueueUserWorkItem - работает начиная с 2000ки

Автор: JoyEx 13.12.2005, 19:10
Цитата(Sman @ 11.11.2005, 13:58)
Есть некий activeX (неоконный). В него надо добавить таймер. Но ведь для таймера используется static CALLBACK процедура. Из нее можно получить доступ к объектам класса? И есть ли хендл (HWND) у ocx?


1) Если у тебя GUI поток, то он может получить WM_TIMER, первичный поток всегда GUI даже, если у него нету окон.

2) Говоришь smile "CALLBACK процедура". А как ты передашь в неё что-то? Посмотри на нее внимательнее - HWND у тебя же NULL, но можно сделать это через глобальный указатель.

3) В первом предложении ты сам ответил на последний вопрос. smile

Автор: SeregaLBN 13.12.2005, 20:14
SetTimer(NULL, 0, 100, MyFunc) вернёт уникальный id таймера
сохраняй его в глобальной переменной типа
Код

   typedef std::map<UINT /* timer id */, MyClass* /* this */> MAP_IdThis;
   MAP_IdThis g_map;


в MyFunc придёт этот id
ну а выбрав из g_map свой экземпляр, делаешь все что тебе требуется...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)