为什么我在编译mfc应用程序时遇到此错误?

时间:2014-07-23 11:11:10

标签: c++ mfc

我有这段代码:

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

1 个答案:

答案 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...
}