我有这段代码:
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文档中的代码:
答案 0 :(得分:2)
您应该CTestTimeUpDlg::MyTimerProc
静态。但是,通过执行此操作,您无法访问m_TimerDisplayValue
等实例成员。
在这种情况下,您不应该使用回调。设置lpfnTimer
NULL,作为the link示例中的第一个计时器。这样,计时器发布消息WM_TIMER
,您可以通过非静态成员函数处理它。
添加强>
似乎the document(加上我的话)缺乏解释。
执行以下操作以实现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...
}