2

Windows 7 上的德尔福 7

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

4

2 回答 2

2

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

正确WM_MOUSEWHEEL的消息处理程序需要考虑该参数并保持“滚动累加器”以跟踪滚轮滚动了多远,或者能够滚动不到整行。假设每条消息都表示完全单击滚轮的消息处理程序将很抱歉。

于 2010-09-13T12:54:31.900 回答
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;
于 2018-08-20T08:54:47.350 回答