如何通知应用程序以编程方式设置的滚动条值?
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_VERT
或 SB_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 问题)。 :-)以上是关于如何通知应用程序以编程方式设置的滚动条值?的主要内容,如果未能解决你的问题,请参考以下文章