【问题标题】:MouseWheelDown event fires multiple times in successionMouseWheelDown 事件连续触发多次
【发布时间】:2010-09-13 07:21:05
【问题描述】:

Windows 7 上的 Delphi 7

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

【问题讨论】:

    标签: delphi mousewheel


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的洞察力。我会深入研究。
    【解决方案2】:

    解决方法很简单:调用你要执行的函数OnMouseWheel后,你必须设置Handled:=True,这样该例程就不会被多次调用。例如

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

    【讨论】:

    • 快速清晰。这应该是公认的答案。谢谢。 +1
    猜你喜欢
    • 2021-11-19
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多