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

Posted

技术标签:

【中文标题】如何通知应用程序以编程方式设置的滚动条值?【英文标题】:How can I notify an application of a programmatically set scrollbar value? 【发布时间】:2010-06-11 13:12:19 【问题描述】:

我的代码涉及标准的Scroll Bar 控件,碰巧在某些情况下我需要以编程方式更改其值。我使用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_VERTSB_HORZ 类型的滚动条)来执行此操作。我可以像这样将WM_HSCROLL 和WM_VSCROLL 发送到窗口:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于如何通知应用程序以编程方式设置的滚动条值?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式使用 android studio 4.2.1 将我的应用程序图标设置为一个信号通知

以编程方式访问应用程序通知设置[重复]

如何以编程方式设置滚动视图高度

在 iOS 中以编程方式禁用设置警报

如何以编程方式在应用程序图标上设置徽章?

以编程方式将 UIPageViewController 过渡样式设置为滚动