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);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值