MouseWheelDown事件连续多次触发

时间:2010-09-13 07:21:05

标签: delphi mousewheel

Windows 7上的Delphi 7

我想使用鼠标滚轮向下滚动列表(TElTree)...所以我开始在ElTree的OnMouseWheelDown事件中编写一些代码。然后我注意到它一次滚动2行。 “控制面板”中的鼠标滚轮设置设置为一次仅滚动1行。如果我在事件处理程序中放置一个断点,我发现事件处理程序本身正在快速连续执行两次....为什么?如何确保它只执行一次(代码请)?

2 个答案:

答案 0 :(得分:2)

当滚轮滚动时,操作系统会发送WM_MOUSEWHEEL条消息。 wParam参数的高位字表示车轮已经转动了多远。如果它已经转为一次“点击”,则其值将为120或WHEEL_DELTA。但如果您的滚轮识别出滚动值低于点击次数,则可能会小于此值。

正确的WM_MOUSEWHEEL消息处理程序需要考虑该参数并保留一个“滚动累加器”以跟踪滚轮滚动的距离,或者能够滚动少于一整行。消息处理程序假设每条消息都表示完全点击了滚轮将很抱歉。

答案 1 :(得分:1)

解决方案非常简单:调用要执行的功能OnMouseWheel后,必须设置Handled:=True,以使例程不会被多次调用。例如

procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  YourFunctionToExecute(Sender, Shift, MousePos, Handled);
  Handled:=True;
end;