2009-09-21 5 views
1

Я подклассифицировал CListCtrl в свой класс, и я использую его в нескольких диалогах и представлениях. То, что я хочу сделать, это выполнить некоторый код, когда ClistCtrl прокручивается по вертикали. Мне нужно, чтобы это было в самом подклассе CListCtrl.Как поймать событие прокрутки в CListCtrl?

я могу обнаружить прокруткой срабатывать при взаимодействии с скроллинга с помощью метода, предоставленной demoncodemonkey:

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

Но:

  • Колесо мыши скроллинг не вызывает 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

+3

Я согласен с вами в том, что WM_VSCROLL не вызывается в этих обстоятельствах, однако если то, что я написал, ответил на ваш первоначальный вопрос, тогда вы должны были принять мой ответ, а затем задать другой вопрос. – demoncodemonkey

3

Колесо мыши прокрутки триггера OnMouseWheel.

+0

OnMouseWheel запускается в родительском диалоговом окне. ON_NOTIFY_REFLECT может справиться с этим, если я не ошибаюсь, но у меня нет полного примера. – rec

+2

OnMouseWheel IS запускается в производном классе. Я успешно добавил ON_WM_MOUSEWHEEL к моей карте сообщений и реализовал «BOOL OnMouseWheel (UINT fFlags, short zDelta, CPoint point)». –