Windows 7 上的德尔福 7
我想使用鼠标滚轮向下滚动列表(TElTree)......所以我开始在 ElTree 的 OnMouseWheelDown 事件中编写一些代码。然后我注意到它一次滚动了 2 行。控制面板中的鼠标滚轮设置为一次只能滚动 1 行。如果我在事件处理程序中放置一个断点,我发现事件处理程序本身正在快速连续执行两次......为什么?如何确保它只执行一次(请提供代码)?
Windows 7 上的德尔福 7
我想使用鼠标滚轮向下滚动列表(TElTree)......所以我开始在 ElTree 的 OnMouseWheelDown 事件中编写一些代码。然后我注意到它一次滚动了 2 行。控制面板中的鼠标滚轮设置为一次只能滚动 1 行。如果我在事件处理程序中放置一个断点,我发现事件处理程序本身正在快速连续执行两次......为什么?如何确保它只执行一次(请提供代码)?
当滚轮滚动时,操作系统会发送WM_MOUSEWHEEL
消息。参数的高位字wParam
表示车轮转动了多远。如果它已经转动了一次“点击”,那么它的值将是 120,或者WHEEL_DELTA
。但是,如果您的滚轮识别出滚动小于点击的价值,它可能会小于这个值。
正确WM_MOUSEWHEEL
的消息处理程序需要考虑该参数并保持“滚动累加器”以跟踪滚轮滚动了多远,或者能够滚动不到整行。假设每条消息都表示完全单击滚轮的消息处理程序将很抱歉。
解决方法很简单:调用你要执行的函数后,OnMouseWheel
你必须进行设置Handled:=True
,使例程不会被多次调用。例如
procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
YourFunctionToExecute(Sender, Shift, MousePos, Handled);
Handled:=True;
end;