MFC OnIdle的处理

  CWinThread::Run()的代码如下:

// main running routine until threadexits

intCWinThread::Run()

{

      ASSERT_VALID(this);

 

      // for tracking the idle time state

      BOOL bIdle = TRUE;

      LONG lIdleCount = 0;

 

      // acquire and dispatch messages until a WM_QUIT message isreceived.

      for (;;)

      {

             // phase1: check to see if we can do idlework

             while (bIdle&&

                    !::PeekMessage(&m_msgCur, NULL, NULL, NULL,PM_NOREMOVE))

             {

                    // call OnIdle while in bIdle state

                    if (!OnIdle(lIdleCount++))

                           bIdle = FALSE; // assume "no idle" state

             }

 

             // phase2: pump messages while available

             do

             {

                    // pump message, but quit on WM_QUIT

                    if (!PumpMessage())

                           return ExitInstance();

 

                    // reset "no idle" state after pumping "normal"message

                    if(IsIdleMessage(&m_msgCur))

                    {

                           bIdle = TRUE;

                           lIdleCount = 0;

                    }

 

             } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL,PM_NOREMOVE));

      }

 

      ASSERT(FALSE);  // notreachable

}

 
 BOOLCWinThread:: PumpMessage()

  {

   ASSERT_VALID(this);

 

   if(!::GetMessage(&m_msgCur, NULL, NULL,NULL))

    returnFALSE;

   // process thismessage

   if (m_msgCur.message != WM_KICKIDLE&&!PreTranslateMessage(&m_msgCur))

   {

    ::TranslateMessage(&m_msgCur);

    ::DispatchMessage(&m_msgCur);

   }

   returnTRUE;

  }


看了上面的代码,你应该已经明白OnIdle的工作流程。

这里需要注意lIdleCount 这个变量,每当有消息被处理后, lIdleCount的值就会恢复为0.

CWinApp::OnIdle(0); 也就是 当 lIdleCount 的值为0 的时候,会导致 CDocument::OnIdle() 函数被调用;当时当 lIdleCount 值不为0的时候,就不会调用CDocument::OnIdle()。具体的调用可以看调用堆栈,这里只给出结果。


方法一:

对于MFC程序来讲,很多是采用MFC的文档视图类的框架。比如如果你要让视图不断刷新,在这个不断刷新的视图中可以完成场景渲洒更新等操作。你当然可以在 YourMethod()中获取视图的pView的指针,然后调用其内的接口函数, 就像这样:

 

 

 CMainFrame *parent = (CMainFrame *)AfxGetMainWnd();

 if ( parent && parent->GetSafeHwnd() )
 { 
   CFrameWnd* pFrame = parent->GetActiveFrame();

       CView *pView = pFrame->GetActiveView();
       if ( pView )
      {
         pView->Invalidate();
       }
  
 }

方法二:

可以直接调用 CWinApp::OnIdle(0); 最后会调用到CDocument::OnIdle() 函数,代码可以参照下面:

POSITION pos = GetFirstViewPosition();
while ( pos != NULL )
{
  CView* pView = GetNextView( pos );
  pView->Invalidate();
    pView->UpdateWindow();
 } 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值