Почему я получаю эту ошибку при компиляции приложения MFC?

0

У меня есть этот код:

void CALLBACK CTestTimeUpDlg::MyTimerProc(
   HWND hWnd,      // handle of CWnd that called SetTimer
   UINT nMsg,      // WM_TIMER
   UINT_PTR nIDEvent,   // timer identification
   DWORD dwTime    // system time
)
{
    const int m_TimerValue=0;
    double timeValueSec=m_TimerValue/1000.0;
    CString valueString;
    valueString.Format(L"%3.3f",timeValueSec);
    m_TimerDisplayValue.SetWindowTextW(valueString);
}


void CTestTimeUpDlg::OnBnClickedButtonStart()
{
    m_TimerValue=0;
    m_Timer = SetTimer(1, 1, &CTestTimeUpDlg::MyTimerProc);

}

но когда я скомпилировал его, я получаю эту ошибку:

 'CWnd::SetTimer' : cannot convert parameter 3 from 'void (__stdcall CTestTimeUpDlg::* )(HWND,UINT,UINT_PTR,DWORD)' to 'void (__stdcall *)(HWND,UINT,UINT_PTR,DWORD)'   

код похож на код из документации Microsoft:

http://msdn.microsoft.com/en-us/library/49313fdf.aspx

Теги:
mfc

1 ответ

2
Лучший ответ

Вы должны сделать CTestTimeUpDlg::MyTimerProc static. Однако при этом вы не можете получить доступ к таким членам экземпляра, как m_TimerDisplayValue.

В этом случае вы не должны использовать обратный вызов. Установите lpfnTimer NULL, как первый таймер в образце ссылки. Таким образом, таймер WM_TIMER сообщение WM_TIMER, и вы можете обрабатывать его WM_TIMER функцией-членом.

ДОБАВИТЬ:
Кажется, что документ (плюс мои слова выше) отсутствует в объяснении.

Для реализации обработчика WM_TIMER.

Объявить обработчик в объявлении класса:

afx_msg void OnTimer(UINT_PTR nIDEvent);

В вашем файле cpp добавьте сопоставление сообщений:

BEGIN_MESSAGE_MAP(CTestTimeUpDlg, ...)
    ON_WM_TIMER()
END_MESSAGE_MAP()

и реализация:

void CTestTimeUpDlg::OnTimer(UINT_PTR nIDEvent)
{
    // your code here...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню