CListCtrl的OnTimer问题

在CListCtrl中的OnTimer,发现OnTimer只进去一次,而并没有在那里用KillTimer结束了该Timer。着了半天,终于找到答案。

PRB:   OnTimer()   Is   Not   Called   Repeatedly   for   a   List   Control  
   
  Q200054  
   
  --------------------------------------------------------------------------------  
  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/n",   m_pCtrl->m_timerID);  
  }CMyListCtrl::CMyListCtrl()  
  {  
        m_timerID   =   -1;  
  }void   CMyListCtrl::OnTimer(UINT   nIDEvent)  
  {  
        if   (nIDEvent   !=   m_timerID)  
              CListCtrl::OnTimer(nIDEvent);  
        TRACE("OnTimer   %d/n",   nIDEvent);  
  }    
   
  Additional   query   words:   CListview   CListctrl   WM_TIMER   OnTimer  

原来在CListCtrl中,默认的OnTimer会调用KillTimer。因此,如果是自己的timmerID,则不调用基类的 OnTimer 即可,而且ID尽量设置大一点。所以CListCtrl中的OnTimer结构应该如下:

if (nIDEvent == nMyTimerID)

{//是自己的Timer

    .......

}

else

{

      CListCtrl::OnTimer(nIDEvent);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值