В моем коде используется стандартный элемент прокрутки , и в некоторых случаях мне нужно программно изменять его значение. Я делаю это с помощью функции 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
), и я не знаю, в какое окно отправить сообщение.