我也遇到过这种问题。
不过可以另外创建一个线程,来完成Timer所做的工作。

解决方案 »

  1.   

    不要把定时器定义放到Draw()中,Draw函数会不断的被窗口调用。
    这会重复定义定时器。
    出错就是因为已经定义了1的定时器,再去定义就报错。
      

  2.   

    楼上说的有些道理,你可以这么写
    KillTimer(1);
    SetTimer(1,1000,0);
      

  3.   

    同意楼上的,SetTimer(1,1000,0)最好是放在OnInitDialog()里面,或者OnCreate()里面
    它的第一个参数是Timer的id,是唯一的,当第二次调用Draw()函数的时候,程序发现试图创建一个已经存在的Timer,自然会报错.
      

  4.   

    我同意akirya的说法,楼主是不是没有调用Create创建窗口如果没有创建窗口,消息循环是建立不起来的,(WM_COMMAND可以,从CCmdTarget派生就可以了。)还有多次调用SetTimer是没有问题的,只会让上一次的计时重新开始
      

  5.   

    CWnd::SetTimer的代码:
    _AFXWIN_INLINE UINT_PTR CWnd::SetTimer(UINT_PTR nIDEvent, UINT nElapse,
    void (CALLBACK* lpfnTimer)(HWND, UINT, UINT_PTR, DWORD))
    { ASSERT(::IsWindow(m_hWnd)); return ::SetTimer(m_hWnd, nIDEvent, nElapse,
    lpfnTimer); }
    重复SetTimer是没事的,不过从ASSERT(::IsWindow(m_hWnd))一句就可以看出,窗口没建立是绝对不行的。
    不过没窗口不表示不能用定时器,可以
    1、定义如下函数,可以是全局函数或是类静态成员函数,不能是普通类成员函数
    CALLBACK void TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
    {
    }
    2、
    UINT_PTR nIDEvent = ::SetTimer(NULL, NULL, nElapse, TimerProc);
    第二个参数是NULL,而定时器事件号为返回值,每次定时器溢出,调用第四个参数指定的回调函数TimerProc。详见msdn。