Как я могу уведомить приложение о программно установленном значении полосы прокрутки? - PullRequest
1 голос
/ 11 июня 2010

В моем коде используется стандартный элемент прокрутки , и в некоторых случаях мне нужно программно изменять его значение. Я делаю это с помощью функции SetScrollInfo , как в этом примере:

void setScrollBarValue( HWND scrollBar, int value )
{
    SCROLLINFO si = { sizeof( SCROLLINFO ); }
    si.fMask = SIF_POS;
    si.nPos = value;
    ::SetScrollInfo( scrollBar, SB_CTL, &si, true /* redraw */ );
}

Это выглядит нормально (большой палец полосы прокрутки перемещается), но не может уведомить остальную часть приложения о новом значении полосы прокрутки. Например, элемент управления для редактирования, который использует полосу прокрутки (так же, как в приложении блокнота Windows), не может прокручиваться, поскольку не получает уведомления о новом значении полосы прокрутки.

В случае, если это важно: полоса прокрутки, которую я изменяю, находится не в том же процессе, что и выше setScrollBarValue функция.

Кто-нибудь знает, как этого добиться?

Редактировать: Я узнал, как это сделать с помощью полос прокрутки окна по умолчанию (типа SB_VERT или SB_HORZ). Я могу отправить WM_HSCROLL и WM_VSCROLL в окно следующим образом:

::SendMessage( windowContainingScrollBar,
               WM_HSCROLL,
               MAKEWPARAM( SB_THUMBPOSITION, si.nPos ), NULL );

Однако в моем случае полоса прокрутки имеет собственный дескриптор окна (она имеет тип SB_CTL). Это означает, что я не знаю ориентацию полосы прокрутки (поэтому я не могу сказать, отправлять ли WM_HSCROLL или WM_VSCROLL), и я не знаю, в какое окно отправить сообщение.

1 Ответ

1 голос
/ 11 июня 2010

Попробуйте отправить сообщение WM_VSCROLL после вызова SetScrollInfo ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...