我正在尝试使用基本(模板)MFC应用程序,我希望根据计时器事件更新CDocument
(代表模型)实例,例如,从一个点移动一个圆圈客户区域到另一个点,根据圆圈的经过时间和速度。
我已经在应用程序类中添加了启动计时器的代码:
m_timer = m_pMainWnd->SetTimer( 16, 1000, NULL);
每秒应发送60次定时器消息。 但是,我遇到了几个问题:
在派生的ON_WM_TIMER()
.cpp文件的消息映射中添加CDocument
条目不起作用,引用了c2446错误(将成员函数指针强制转换为void指针)。
尝试使用具体的CView
类不会导致错误,但永远不会调用OnTimer
函数。
调用OnTimer
的唯一地方是在派生的CFrameWndEx
类中,使用以下签名:
afx_msg void OnTimer( UINT_PTR nIDEvent );
据我所知,CFrameWndEx
无法调用CView
或CDocument
派生类中的更改。
我很确定这只是由于我对MFC架构缺乏认识,所以我很感激一些指示。
答案 0 :(得分:3)
将OnTimer函数和ON_WM_TIMER消息宏添加到CView派生类中。在CView中,您可以调用GetDocument()。这是最简单的方法。文档不是窗口,因此无法处理窗口消息。他们唯一可以处理的是WM_COMMAND消息,因为MFC通过其命令消息路由为文档提供了响应这些消息的方式。
另一种方法是创建TIMERPROC函数。
我推荐第一种方式。
答案 1 :(得分:1)
就像Joe Willcoxson建议的那样,只需将OnTimer
方法放在具体的CView
中。但是,您无法使用您发布的SetTimer
方法:
m_timer = m_pMainWnd->SetTimer( 16, 1000, NULL);
您必须在CView
课程中的某个地方调用它,而不是m_pMainWnd
,例如像:
CMyView::OnInitialUpdate()
{
m_timer = SetTimer( 16, 1000, NULL); // also nullptr instead of NULL would be nice
}
否则主窗口将始终是处理消息的CWnd
。