У меня есть этот код:
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:
Вы должны сделать 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...
}