1

我在 VS2010 中创建了一个基于 MFC 对话框的应用程序,并想添加计时器以每 3 秒更新一次图片控制器。但是 OnTimer 方法从未奏效。

我使用类向导将 WM_TIMER 添加到消息队列中,结果如下:

BEGIN_MESSAGE_MAP(CxxxxDlg, CDialogEx)
    ON_WM_PAINT()
    ON_BN_CLICKED(IDOK, &CxxxxDlg::OnBnClickedOK)
    ON_WM_TIMER()
END_MESSAGE_MAP()

在 xxxxDlg.cpp 中,我将 SetTimer 方法放在 OnInitDialog 中:

BOOL CxxxxDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    SetIcon(m_hIcon, TRUE);
    SetIcon(m_hIcon, TRUE);

    _imageCounter = 1;
    _isMale = 3;
    _testNum = 0;

    SetTimer(123, 2000, NULL);

    bFullScreen = false;
    OnFullShow();
    updateImages();
    UpdateData();

    return TRUE;
}

OnTimer 方法在 xxxdlv.h 中声明:

public:
    afx_msg void OnTimer(UINT_PTR nIDEvent);

当我运行应用程序时,SetTimer 返回 123。所以这里应该一切正常。但是程序从来没有到达我在 OnTimer 方法的第一行设置的断点!

然后我写了另一个hello world项目只是为了测试计时器。我以完全相同的方式设置计时器并且效果很好。

所以我认为 OnFullShow() 方法可能是问题所在。此方法用于将窗口更改为全屏模式。我评论了这一行,但 OnTimer 仍然没有工作。

我在这里检查了问题。但这无济于事。

有谁知道问题出在哪里?谢谢!

PS。我确实收到了一些内存泄漏的警告。这有关系吗?

4

1 回答 1

1

感谢@IInspectable。我在这里找到了技术支持。它充分解释了原因并提供了一种解决方案:

// Rewrite PreTranslateMessage method
BOOL CMyApp::PreTranslateMessage( MSG *pMsg )
{
   // If this is a timer callback message let it pass on through to the
   // DispatchMessage call.
   if( (pMsg->message==WM_TIMER) && (pMsg->hwnd==NULL) )
       return FALSE;
   ...
   // The rest of your PreTranslateMessage goes here.
   ...

   return CWinApp::PreTranslateMessage(pMsg);
}

这个解决方案不能解决我的问题,但给了我一个提示。PreTranslateMessage应该重写方法以WM_TIMER传递给 DispatchMessage 调用。但是如果你是PreTranslateMessage用来处理其他消息的,WM_KEYDOWN例如,上面的解决方案可能不起作用。好像是优先级的问题。最后,我使用switch而不是解决它if

// Rewrite PreTranslateMessage method
BOOL CMyApp::PreTranslateMessage( MSG *pMsg )
{
   // If this is a timer callback message let it pass on through to the
   // DispatchMessage call.
   switch(pMsg->message)
   {
    case WM_KEYDOWN: // your codes
    case WM_TIMER: return false;
    ...
   }
   ...
   // The rest of your PreTranslateMessage goes here.
   ...

   return CWinApp::PreTranslateMessage(pMsg);
}

我希望这会帮助任何有类似问题的人。

PS。pMsg->hwnd==NULL被删除,switch我不确定它是否安全。

于 2013-10-07T16:22:04.457 回答