如题

解决方案 »

  1.   

    void  PASCAL OnTimerProc(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2)//定时器处理回调函数
    {
    PostMessage(AfxGetMainWnd()->GetSafeHwnd(),MYMSG_TIMER,0,0);
    }
    void CMainFrame::SetMyTimer(void)
    {
    if(timeGetDevCaps(&tc, sizeof(TIMECAPS)) == TIMERR_NOERROR)
    {
    //定时器分辨率的值不能超出系统的取值范围,
             wAccuracy = min(max(tc.wPeriodMin,1),tc.wPeriodMax);
                      //调用timeBeginPeriod函数设置定时器的分辨率
    timeBeginPeriod(wAccuracy);
                      //安装异步计时器
    TimerID = timeSetEvent(
    1000, //定时间隔为10ms
    wAccuracy, //分辨率
    (LPTIMECALLBACK) OnTimerProc,    //回调函数
    (DWORD) this,                       //用户自传送到回调函数的数据
    TIME_PERIODIC                       //周期发送
    );
    if(TimerID == 0)
    AfxMessageBox("启动定时器失败!");   //不等于0表明加装成功,返回此定时器的句柄  
    }
    }LRESULT CMainFrame::OnMymsgTimer(WPARAM wParam, LPARAM lParam)
    {
    MessageBox("","");
    return 0;
    }代码如上,现在我想执行OnMymsgTimer()中的消息框,可是没反应,怎么回事儿呢?
      

  2.   

    AfxGetMainWnd()->GetSafeHwnd()改成AfxGetApp()->GetMainWnd()->GetSafeHwnd()试试
      

  3.   

    MYMSG_TIMER有没有定义啊?是什么样的错误给我们看看呢?
      

  4.   

    multimedia timer定时器运行在自己的独立线程中,AfxGetMainWnd()是获取当前线程的主窗口,所以这个消息不会被发送到CMainFrame.你已经将CMainFrame的指针传给了回调函数,可以这样试试CMainFrame* pFrame = (CMainFrame*) dwUser
    (pFrame->GetSafeHwnd(),MYMSG_TIMER,0,0);或者试试我刚才说的方法
      

  5.   

    将 LRESULT CMainFrame::OnMymsgTimer(WPARAM wParam, LPARAM lParam)在头文件中的声明格式写为:afx_msg LRESULT OnMymsgTimer(WPARAM wParam, LPARAM lParam);在cpp文件中的END_MESSAGE_MAP前加入如下行:    ON_MESSAGE(MYMSG_TIMER, OnMymsgTimer)同时MYMSG_TIMER的定义值必须大于 WM_USER,例如如下声明方式:#define MYMSG_TIMER      WM_USER + 1