我有一个窗口,它有自己的H和V滚动。我是这样处理这个事件的:
case WM_VSCROLL:
SetScrollPos(hWnd, SB_VERT, (int)HIWORD(wParam), TRUE);
break;我只想让滚动条的位置在我松开鼠标后保持不变,但它所做的只是在松开鼠标后回到顶部。我做错了什么?
谢谢
发布于 2010-05-16 22:32:45
WM_VSCROLL消息的代码参数可以是SB_TOP、SB_BOTTOM、SB_PAGEUP、SB_PAGEDOWN、SB_LINEUP、SB_LINEDOWN、SB_THUMBPOSITION或SB_THUMBTRACK,其中的名称应该自行解释。
SB_TOP和SB_BOTTOM表示滚动窗口将分别转到顶部或底部。可以通过右击垂直滚动条并选择“顶部”和“底部”来发送这些消息。(在Windows记事本中,Win XP+对于instance.)SB_PAGEUP和SB_PAGEDOWN意味着向上或向下的页面(屏幕)。如果您单击拇指或向上或向下箭头旁边滚动条上的某个位置,或者如果您使用滚动条的右键单击menu.SB_LINEUP和SB_LINEDOWN,则当用户单击滚动条上的向上和向下按钮或选择相应的右键菜单时,将发送commands.SB_THUMBTRACK。当用户通过拖动鼠标滚动时,将连续发送scrollbar.SB_THUMBPOSITION当用户释放拇指时,将发送thumb。有关更多信息,请参阅MSDN文章WM_VSCROLL。
因此,当您收到WM_VSCROLL消息时,您首先需要自己进行滚动。例如,如果您正在编写文本编辑器,则需要重新绘制文本,但在窗口顶部使用不同的行。然后,您需要将滚动条更新到它的新位置,最好是通过SetScrollInfo,但也可以使用旧的SetScrollPos函数。
发布于 2016-10-10 16:47:33
在案例部分中,系统正在处理WM_VSCROLL消息。它将在您的SetScrollPos之后运行默认的窗口过程。在默认的窗口过程中,系统本身将设置滚动条的拇指位置。所以,尽管SetScrollPos生效,系统还是会在那之后改变拇指的位置。我认为你应该在调用默认的窗口过程之后做你的SetScrollPos,也就是,也许在返回这个函数之后,然后你就可以SetScrollPos了。
https://stackoverflow.com/questions/2844082
复制相似问题