--------------------------------------------------------------------------------
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
本文探讨了在Microsoft Foundation Classes (MFC)中使用List Control时遇到的一个常见问题:即SetTimer设置的WM_TIMER消息仅被调用两次。文章详细解释了此现象的原因,并提供了修改OnTimer函数来避免默认处理行为的解决方案。
2763

被折叠的 条评论
为什么被折叠?



