我新建了一个MFC类,它派生自CWnd,为什么不能用OnTimer 我也遇到过这种问题。不过可以另外创建一个线程,来完成Timer所做的工作。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不要把定时器定义放到Draw()中,Draw函数会不断的被窗口调用。这会重复定义定时器。出错就是因为已经定义了1的定时器,再去定义就报错。 楼上说的有些道理,你可以这么写KillTimer(1);SetTimer(1,1000,0); 同意楼上的,SetTimer(1,1000,0)最好是放在OnInitDialog()里面,或者OnCreate()里面它的第一个参数是Timer的id,是唯一的,当第二次调用Draw()函数的时候,程序发现试图创建一个已经存在的Timer,自然会报错. 我同意akirya的说法,楼主是不是没有调用Create创建窗口如果没有创建窗口,消息循环是建立不起来的,(WM_COMMAND可以,从CCmdTarget派生就可以了。)还有多次调用SetTimer是没有问题的,只会让上一次的计时重新开始 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。 GPS坐标如何转换成百度、谷歌地图坐标? 一个线程基础问题 MFC删除所有菜单项再添加新项后无法成功GetSubMenu() 成员函数调用问题 有没有这样的一个软件 无模式对话框重复调用问题? xp下使用platform sdk一问 紧急求助,如何在资源管理器中的目录树(tree)上增加一个节点(和控制面板同一级),节点如同“我的文档”一样,指向某个目录? 救我啊,哪位大侠英文厉害的帮我E化几个汉字,来都有分... 控件透明 vs2005问题救助 我的程序中有若干个视图,我怎么指定预览窗口的打印按钮打印指定视图?
这会重复定义定时器。
出错就是因为已经定义了1的定时器,再去定义就报错。
KillTimer(1);
SetTimer(1,1000,0);
它的第一个参数是Timer的id,是唯一的,当第二次调用Draw()函数的时候,程序发现试图创建一个已经存在的Timer,自然会报错.
_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。