Почему метод OnVScroll () входит только один раз? - PullRequest
1 голос
/ 28 октября 2008

Я создаю класс, который наследуется от CScrollBar в диалоговом приложении MFC. В классе диалога (MyScrollbarDlg) я устанавливаю сообщение ON_WM_VSCROLL и объявляю метод OnVSCroll в файле заголовка. Я также реализую метод OnVScroll () в соответствующем файле .cpp. Но, к моему удивлению, когда я нажимаю стрелку в нижней части полосы прокрутки, она работает только в первый раз.

Я хочу отладить свой код, поэтому я установил точку останова в методе OnVScroll. Затем произошла странная вещь. Точка останова была достигнута только при первом нажатии. Когда я продолжу, полоса прокрутки исчезла из диалога! Я понятия не имею, как это могло произойти. Может ли кто-нибудь помочь мне исправить эту досадную ошибку? Большое спасибо!

Я установил диапазон прокрутки, как показано ниже:

  SCROLLINFO scrllInfo;
  m_scrollbar.GetScrollInfo(&scrllInfo, SIF_ALL);
  scrllInfo.nMax = 15;
  scrllInfo.nMin = 0;
  scrllInfo.nPage = 0;
  scrllInfo.nPos = 0;
  m_scrollbar.SetScrollInfo(&scrllInfo, TRUE);

Кстати, я не использую встроенную полосу прокрутки диалогового окна, а элемент управления полосой прокрутки, который устанавливается в качестве члена диалогового окна.

Я провел некоторый эксперимент и обнаружил, что упомянутая проблема возникла только тогда, когда я щелкнул стрелку в нижней части элемента управления полосы прокрутки. Это хорошо работает, когда я нажимаю другую стрелку или перетаскиваю поле прокрутки. Есть ли что-то другое при нажатии на нижнюю стрелку полосы прокрутки, о которой я не знаю?

Я выяснил, что когда сообщение прокрутки НЕ THUMBPOSITION или THUMBTRACK, параметр nPos метода OnVScroll() не используется. Поэтому я изменил свой код так:

    int currPos = m_scrollbar.GetScrollPos(); m_scrollbar.SetScrollPos(currPos + 1,  TRUE);

На этот раз все работает нормально, но если установить точку останова, полоса прокрутки снова исчезнет. Ты знаешь почему?

1 Ответ

1 голос
/ 28 октября 2008

Убедитесь, что вы установили диапазон прокрутки. Если вы не установите это, ваш метод будет вызываться только один раз.

Был там ...


{редактировать} Мне повезло больше с

m_ScrollBar.SetScrollRange(min, max);

чем настройка scrollinfo.

Возможно, вы захотите проверить поле флагов, чтобы убедиться, что оно установлено правильно перед сохранением.

Кроме того, дважды проверьте, что вы звоните

m_ScrollBar.SetScrollPos(CurPos);

чтобы установить позицию после нажатия на кнопку

...