Winapi 如何通知应用程序以编程方式设置的滚动条值?

Winapi 如何通知应用程序以编程方式设置的滚动条值?,winapi,scrollbar,notifications,Winapi,Scrollbar,Notifications,我的代码涉及标准控件,在某些情况下,我需要以编程方式更改其值。我使用函数进行此操作,如本例所示: void setScrollBarValue( HWND scrollBar, int value ) { SCROLLINFO si = { sizeof( SCROLLINFO ); } si.fMask = SIF_POS; si.nPos = value; ::SetScrollInfo( scrollBar, SB_CTL, &si, true /*

我的代码涉及标准控件,在某些情况下,我需要以编程方式更改其值。我使用函数进行此操作,如本例所示:

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
)实现这一点。我可以将和发送到窗口,如下所示:

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

但是,在我的例子中,滚动条有自己的窗口句柄(它的类型是
SB_CTL
)。这意味着我不知道滚动条的方向(因此我不知道是发送
WM_HSCROLL
还是
WM_VSCROLL
),也不知道要将消息发送到哪个窗口。

在调用SetScrolInfo()后尝试发送消息。

在调用SetScrolInfo()后尝试发送消息。

我查看了这一点,但是我的滚动条是一个独特的窗口(因此我传递的是
SB_CTL
);我应该将WM\U VSCROLL发送到哪个窗口?那么WPARAM参数会是什么样的呢?我想应该是
SB_THUMBPOSITION
,但是滚动后我怎么知道拇指的位置呢?与我在示例中将
si.nPos
设置为相同?将消息发送到控件本身。如果它不处理它,它将自动传递到其父窗口。或者您可以直接将其发送到其父窗口。关于参数:使用GetScrollInfo()获取参数-需要在SetScrollInfo()之后调用GetScrollInfo(),因为控件可以调整参数。感谢GetScrollInfo()提示!我现在开始工作了(除了我不知道如何确定
SB_CTL
滚动条的方向,但这是一个单独的SO问题)。:-)我查看了一下,但我的滚动条是一个独特的窗口(因此我传递的是
SB_CTL
);我应该将WM\U VSCROLL发送到哪个窗口?那么WPARAM参数会是什么样的呢?我想应该是
SB_THUMBPOSITION
,但是滚动后我怎么知道拇指的位置呢?与我在示例中将
si.nPos
设置为相同?将消息发送到控件本身。如果它不处理它,它将自动传递到其父窗口。或者您可以直接将其发送到其父窗口。关于参数:使用GetScrollInfo()获取参数-需要在SetScrollInfo()之后调用GetScrollInfo(),因为控件可以调整参数。感谢GetScrollInfo()提示!我现在开始工作了(除了我不知道如何确定
SB_CTL
滚动条的方向,但这是一个单独的SO问题)。:-)