利用计时器更新MFC文档/查看应用程序

时间:2017-04-20 12:27:28

标签: c++ timer mfc

我正在尝试使用基本(模板)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无法调用CViewCDocument派生类中的更改。

我很确定这只是由于我对MFC架构缺乏认识,所以我很感激一些指示。

2 个答案:

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