SetTimer in ATL
От: Аноним  
Дата: 28.06.03 12:03
Оценка:
в методе:
STDMETHODIMP CMyCtl::StartTimer()
{
// TODO: Add your implementation code here
::SetTimer(NULL, 1, 3000, TimerProc);
return S_OK;
}

если TimerProc is global, все хорошо, работает:
VOID CALLBACK TimerProc(HWND, UINT, UINT, DWORD) // работает

если я ее делаю членом класса:
VOID CALLBACK CMyCtl::TimerProc(HWND, UINT, UINT, DWORD) // не компилиться
{ ...
}

компилятор выдает: error C2664: 'SetTimer' : cannot convert parameter 4 from 'void (struct HWND__ *,unsigned int,unsigned int,unsigned long)' to 'void (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,unsigned long)'

как с этим бороться?
Re: SetTimer in ATL
От: Begun Ulad Беларусь  
Дата: 28.06.03 17:14
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Дело в том, что в функцию класса передается еще неявный параметр — указатель на this. Поэтому нужно либо объявить свою функцию как static или использовать глобальную
... << RSDN@Home 1.1 alpha 1 >>
\n Give me MSDN and I'll show you the world
Re[2]: SetTimer in ATL
От: Аноним  
Дата: 28.06.03 20:01
Оценка:
Здравствуйте, Begun Ulad, Вы писали:

BU>Здравствуйте, <Аноним>, Вы писали:


BU>Дело в том, что в функцию класса передается еще неявный параметр — указатель на this. Поэтому нужно либо объявить свою функцию как static или использовать глобальную


Спасибо, помогло, другой вопрос, а как сейчас получить доступ к свойствам и методам класса? Ведь указателя this в static-функциях нет.
Re[3]: SetTimer in ATL
От: Begun Ulad Беларусь  
Дата: 29.06.03 02:49
Оценка: 6 (2)
Здравствуйте, <Аноним>, Вы писали:

А>Спасибо, помогло, другой вопрос, а как сейчас получить доступ к свойствам и методам класса? Ведь указателя this в static-функциях нет.


можно использовать CWindow::SetTimer() и обрабатывать WM_TIMER
... << RSDN@Home 1.1 alpha 1 >>
\n Give me MSDN and I'll show you the world
Re[4]: SetTimer in ATL
От: Аноним  
Дата: 29.06.03 06:30
Оценка:
Здравствуйте, Begun Ulad, Вы писали:

BU>Здравствуйте, <Аноним>, Вы писали:


А>>Спасибо, помогло, другой вопрос, а как сейчас получить доступ к свойствам и методам класса? Ведь указателя this в static-функциях нет.


BU>можно использовать CWindow::SetTimer() и обрабатывать WM_TIMER


У меня ActiveX компонента, у нее по-моему нет родителя CWindow
Re[5]: SetTimer in ATL
От: Аноним  
Дата: 29.06.03 06:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Begun Ulad, Вы писали:


BU>>Здравствуйте, <Аноним>, Вы писали:


А>>>Спасибо, помогло, другой вопрос, а как сейчас получить доступ к свойствам и методам класса? Ведь указателя this в static-функциях нет.


BU>>можно использовать CWindow::SetTimer() и обрабатывать WM_TIMER


А>У меня ActiveX компонента, у нее по-моему нет родителя CWindow


Опять я, пытаюсь заюзать CWindow::SetTimer(), выскакивает Assert, типа не IsWindow
Re[5]: SetTimer in ATL
От: Begun Ulad Беларусь  
Дата: 29.06.03 12:57
Оценка: 3 (1)
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Begun Ulad, Вы писали:


BU>>Здравствуйте, <Аноним>, Вы писали:


А>>>Спасибо, помогло, другой вопрос, а как сейчас получить доступ к свойствам и методам класса? Ведь указателя this в static-функциях нет.


BU>>можно использовать CWindow::SetTimer() и обрабатывать WM_TIMER


А>У меня ActiveX компонента, у нее по-моему нет родителя CWindow


можно попробовать так :

// header (HPP file)

class CYourCtrlClass
{

    // your code
  // 

// timer code    
    struct TimerData
    {
        CYourCtrlClass* this_;
        // another timer data
    };

    typedef std::map<UINT, TimerData*> TIMERS;
    static TIMERS timers_;

    static void CALLBACK TimerProc(
        HWND hWnd,      // handle of CWnd that called SetTimer
        UINT nMsg,      // WM_TIMER
        UINT nIDEvent,  // timer identification
        DWORD dwTime    // system time
        );
        
    void startTimer();
    void OnTimer(TimerData* pData);
    // more code
};

// implementation (CPP file)

// static members
CYourCtrlClass::TIMERS CYourCtrlClass::timers_;

void CYourCtrlClass::TimerProc(
        HWND hWnd,      // handle of CWnd that called SetTimer
        UINT nMsg,      // WM_TIMER
        UINT nIDEvent,  // timer identification
        DWORD dwTime    // system time
        )
{
    TimerData *ptd = timers_[nIDEvent];
    ptd->this_->OnTimer(ptd);
}

// start code
void CYourCtrlClass::startTimer()
{
    TimerData *ptd = new TimerData();
    // init TimerData
    ptd->this_ = this;
    
    UINT timerId = ::SetTimer(NULL, (UINT)ptd, 1000, &TimerProc);
    timers_[timerId]=ptd;
}

// processing timer event
void CYourCtrlClass::OnTimer(...)
{
  ...
}


Удачи
... << RSDN@Home 1.1 alpha 1 >>
\n Give me MSDN and I'll show you the world
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.