2010-05-16 122 views
3

回来后,我有自己的H和V滚动的窗口。我在处理事件是这样的:滚动条移动WM_VSCROLL

case WM_VSCROLL: 

     SetScrollPos(hWnd, SB_VERT, (int)HIWORD(wParam), TRUE); 

     break; 

我要的是滚动条的位置停留,一旦我释放我的鼠标,但它在做什么只是回去后顶部。我究竟做错了什么?

由于

回答

10

WM_VSCROLL消息的wParam参数是SB_TOPSB_BOTTOMSB_PAGEUPSB_PAGEDOWNSB_LINEUPSB_LINEDOWNSB_THUMBPOSITION,或SB_THUMBTRACK,其中所述名称应该解释自己。

  • SB_TOPSB_BOTTOM意味着滚动窗口是分别去的顶部或底部。可以通过右键单击垂直滚动条并选择“顶部”和“底部”来发送这些消息。 (例如,查看Windows记事本,Win XP +。)

  • SB_PAGEUPSB_PAGEDOWN表示页面(屏幕)向上或向下。这些如果滚动条上单击somwhere旁边的拇指或向上或向下箭头发送,或者如果您使用滚动条的右键菜单。

  • SB_LINEUPSB_LINEDOWN是在用户单击滚动条上的向上和向下按钮或选择适当的右键菜单命令时发送的。

  • SB_THUMBTRACK当用户通过拖动滚动条的拇指进行滚动时,会连续发送。

  • SB_THUMBPOSITION在用户释放拇指时发送。

有关更多信息,请参阅MSDN文章WM_VSCROLL

因此,当您收到WM_VSCROLL消息时,您首先需要执行滚动操作。例如,如果您正在编写文本编辑器,则需要重新绘制文本,但在窗口顶部使用不同的行。然后,您需要将滚动条更新到新位置,最好通过SetScrollInfo更新,但您也可以使用旧的SetScrollPos函数。

+0

谢谢,我仍然有点新的WinAPI – jmasterx 2010-05-16 14:37:38

+2

请参阅http://msdn.microsoft.com/en-us/library/bb787531(VS.85).aspx如何处理'WM_VSCROLL'消息的示例。 – 2010-05-16 14:40:59

0

在case部分中,系统正在处理WM_VSCROLL消息。它将在您的SetScrollPos后运行默认的窗口过程。在默认窗口过程中,系统本身将设置滚动条的拇指位置。因此,尽管SetScrollPos会产生效果,但系统之后系统会改变拇指位置。我想你应该在调用默认的窗口过程之后执行你的SetScrollPos,也就是在返回这个函数之后,然后你可以SetScrollPos。