列表控件中的OnTimer() 不能反复调用

 OnTimer()   Is   Not   Called   Repeatedly   for   a   List   Control   
 --------------------------------------------------------------------------------   

    The   information   in   this   article   applies   to:   
        The   Microsoft   Foundation   Classes   (MFC),   included   with:  
  Microsoft   Visual   C++,   32-bit   Editions,   versions   4.2,   5.0,   6.0   
  --------------------------------------------------------------------------------      
    SYMPTOMS

        If   you   call   the   SetTimer   function   to   send   periodic   WM_TIMER   messages   to   a   list   control,   you   may   find   that   the   WM_TIMER   message   handler   (the   OnTimer   function)   for   a   list   control   is   called   only   twice.     
     CAUSE  
  The   WM_TIMER   handler   in   the   list   control   calls   the   KillTimer   function.     
     RESOLUTION  
  If   you   define   the   timer   ID   in   the   SetTimer   call,   do   not   call   the   default   handler   for   WM_TIMER.     
    STATUS  
  This   behavior   is   by   design.     
    MORE   INFORMATION  
  The   list   control   uses   the   timer   for   editing   labels,   and   for   scrolling.   When   you   handle   the   timer   message,   if   the   timer   ID   is   your   own   timer,   don't   call   the   default   handler   (CListCtrl::OnTimer).   
   In   the   sample   code   below,   without   the   if   clause   in   the   CMyListCtrl::OnTimer   function,   the   default   WM_TIMER   handler   is   always   called,   which   destroys   both   the   control's   timer   and   your   own   timer.   As   a   result,   you   should   see   a   trace   statement   for   each   timer.     
    

   void   CGensdiView::OnInitialUpdate()    
  {  
        CView::OnInitialUpdate();   
        m_pCtrl   =   new   CMyListCtrl;  
        m_pCtrl->Create(WS_VISIBLE   |   WS_CHILD   |   WS_BORDER    
                                        |   LVS_REPORT   |   LVS_EDITLABELS,    
                                        CRect(0,   0,   100,   150),   this,   2134);       m_pCtrl->InsertColumn(0,   "one");  
        m_pCtrl->InsertItem(0,   "0   0   0   0   0   0   0   0   0   0   0");  
        m_pCtrl->InsertItem(1,   "1   1   1   1   1   1   1   1   1   1   1");  
        m_pCtrl->InsertItem(2,   "2   2   2   2   2   2   2   2   2   2   2");  
  }

void   CGensdiView::OnLButtonDown(UINT   nFlags,   CPoint   point)    
  {  
        m_pCtrl->m_timerID   =   m_pCtrl->SetTimer(14,   500,   NULL);  
        TRACE("timer   %d   is   set ",   m_pCtrl->m_timerID);  
  }

CMyListCtrl::CMyListCtrl()  
  {  
        m_timerID   =   -1;  
  }

void   CMyListCtrl::OnTimer(UINT   nIDEvent)  
  {  
        if   (nIDEvent   !=   m_timerID)  
              CListCtrl::OnTimer(nIDEvent);  
        TRACE("OnTimer   %d ",   nIDEvent);  
  }     
  Additional   query   words:   CListview   CListctrl   WM_TIMER   OnTimer   KillTimer   SetTimer   once     

 

你可能感兴趣的:(timer,function,list,Microsoft,mfc,behavior)