2009-09-21 61 views
1

我將CListCtrl分類到我自己的類中,並在幾個對話框和視圖中使用它。我想要做的是在ClistCtrl垂直滾動時執行一些代碼。我需要它在CListCtrl子類本身。如何捕捉CListCtrl中的滾動事件?

messagemap:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) 
    ON_WM_VSCROLL() 
END_MESSAGE_MAP() 

方法聲明:

class CMyListCtrl : public CListCtrl 
{ 
    //... 
protected: 
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); 
    DECLARE_MESSAGE_MAP() 
}; 

方法實現:

我可以檢測滾動與方法滾動條由demoncodemonkey提供交互時觸發

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
    //do some stuff here 
    CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar); 
} 

但是:

  • 鼠標滾輪滾動不會觸發 OnVScroll。

  • 自動滾動發生 被點擊一個CListCtrl項部分 可見在底部時(它 被滾動了,因此產品 完全可見的)沒有觸發 OnVScroll任一。例如:

partialy visible item http://i37.tinypic.com/2guxtfn.png

點擊項目9使CListCtrl的滾動一點,所以該項目是完全可見。

回答

4

messagemap:

BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) 
    ON_WM_VSCROLL() 
END_MESSAGE_MAP() 

方法聲明:

class CMyListCtrl : public CListCtrl 
{ 
    //... 
protected: 
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); 
    DECLARE_MESSAGE_MAP() 
}; 

方法實現:

void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{ 
    //do some stuff here 
    CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar); 
} 
+0

這很棒,可以檢測到滾動條滾動,鼠標滾輪被忽略,並且當單擊一個CListCtrl項在底部部分可見時發生的自動滾動(它向上滾動,因此它完全可見)也被忽略。我正在編輯我的原始問題以包含這個部分答案。謝謝! – rec 2009-09-22 15:58:53

+3

我確實同意你在這種情況下不會調用WM_VSCROLL,但是如果我寫的回答了你的原始問題,那麼你應該已經接受了我的回答,然後再問了一個不同的問題。 – demoncodemonkey 2009-09-22 19:58:55

3

鼠標滾輪滾動觸發OnMouseWheel。

+0

OnMouseWheel在父對話框中觸發。如果我沒有弄錯,ON_NOTIFY_REFLECT可以處理這個問題,但我沒有一個完整的例子。 – rec 2009-10-26 20:25:20

+2

OnMouseWheel IS在派生類中觸發。我成功地將ON_WM_MOUSEWHEEL添加到了我的消息映射中,並實現了'BOOL OnMouseWheel(UINT fFlags,short zDelta,CPoint point)'。 – 2009-11-03 13:46:56