Как поймать событие прокрутки в CListCtrl?

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

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

карта сообщений:

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. Например:

частично видимый элемент

При нажатии на элемент 9 ClistCtrl немного прокручивается, чтобы элемент был полностью виден.


person rec    schedule 21.09.2009    source источник


Ответы (3)


карта сообщений:

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);
}
person demoncodemonkey    schedule 21.09.2009
comment
Это было замечательно для обнаружения прокрутки полосы прокрутки, колесо мыши игнорировалось, а автоматическая прокрутка, происходящая при щелчке элемента CListCtrl, частично видимого внизу (он прокручивается вверх, поэтому он полностью виден), также игнорировалась. Я редактирую свой исходный вопрос, чтобы включить этот частичный ответ. Благодарность! - person rec; 22.09.2009
comment
Я согласен с вами, что WM_VSCROLL не вызывается в этих обстоятельствах, однако, если то, что я написал, отвечало на ваш исходный вопрос, вы должны были принять мой ответ, а затем задать другой. - person demoncodemonkey; 22.09.2009

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

person Hokum    schedule 25.10.2009
comment
OnMouseWheel запускается в родительском диалоге. ON_NOTIFY_REFLECT может с этим справиться, если я не ошибаюсь, но у меня нет полного примера. - person rec; 26.10.2009
comment
OnMouseWheel запускается в производном классе. Я успешно добавил ON_WM_MOUSEWHEEL в свою карту сообщений и реализовал BOOL OnMouseWheel (UINT fFlags, short zDelta, CPoint point). - person Randy Voet; 03.11.2009

Гораздо лучшим решением является использование уведомлений LVN_BEGINSCROLL или LVN_ENDSCROLL, которые отправляются в родительское окно. (Они также учитывают прокрутку колеса мыши.)

Хотя это все еще не решает проблему прокрутки, которая возникает, когда пользователь перемещает выбранный элемент списка вверх и вниз с помощью клавиатуры.

person c00000fd    schedule 01.02.2019