我有一个自己的H和V滚动的窗口。我正在处理这样的事件:
case WM_VSCROLL:
SetScrollPos(hWnd, SB_VERT, (int)HIWORD(wParam), TRUE);
break;
我想要的只是当我释放鼠标时滚动条的位置停留但是它正在做的只是回到顶部之后。我做错了什么?
由于
答案 0 :(得分:10)
wParam
邮件的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 +。)
SB_PAGEUP
和SB_PAGEDOWN
表示向上或向下的页面(屏幕)。如果您单击拇指旁边的滚动条或向上或向下箭头上的somwhere,或者使用滚动条的右键单击菜单,则会发送这些内容。
SB_LINEUP
和SB_LINEDOWN
,或者选择相应的右键单击菜单命令。
SB_THUMBTRACK
。
SB_THUMBPOSITION
。
有关详细信息,请参阅MSDN文章WM_VSCROLL。
因此,当您收到WM_VSCROLL消息时,首先需要自己进行滚动。例如,如果您正在编写文本编辑器,则需要重绘文本,但窗口顶部有不同的行。然后,您需要将滚动条更新到新位置,最好是通过SetScrollInfo,但您也可以使用旧的SetScrollPos函数。
答案 1 :(得分:0)
在案例部分,系统正在处理WM_VSCROLL消息。它将在SetScrollPos之后运行默认窗口过程。在默认窗口过程中,系统本身将设置滚动条的拇指位置。因此,虽然SetScrollPos起作用,但系统会在此之后更改拇指位置。我认为你应该在调用默认窗口过程之后执行你的SetScrollPos,也就是说,可能在返回此函数之后,然后你可以使用SetScrollPos。