滚动条在WM_VSCROLL之后移回

时间:2010-05-16 14:21:37

标签: c++ c winapi

我有一个自己的H和V滚动的窗口。我正在处理这样的事件:

case WM_VSCROLL:

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

        break;

我想要的只是当我释放鼠标时滚动条的位置停留但是它正在做的只是回到顶部之后。我做错了什么?

由于

2 个答案:

答案 0 :(得分:10)

wParam邮件的WM_VSCROLL参数为SB_TOPSB_BOTTOMSB_PAGEUPSB_PAGEDOWNSB_LINEUPSB_LINEDOWNSB_THUMBPOSITIONSB_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函数。

答案 1 :(得分:0)

在案例部分,系统正在处理WM_VSCROLL消息。它将在SetScrollPos之后运行默认窗口过程。在默认窗口过程中,系统本身将设置滚动条的拇指位置。因此,虽然SetScrollPos起作用,但系统会在此之后更改拇指位置。我认为你应该在调用默认窗口过程之后执行你的SetScrollPos,也就是说,可能在返回此函数之后,然后你可以使用SetScrollPos。