2

Windows7上のDelphi7

マウスホイールを使用してリスト(TElTree)を下にスクロールしたいので、ElTreeのOnMouseWheelDownイベントでコードを書き始めます。次に、一度に2行スクロールしていることに気付きます。コントロールパネルのマウスホイール設定は、一度に1行だけスクロールするように設定されています。イベントハンドラー内にブレークポイントを配置すると、イベントハンドラー自体が2回連続してすばやく実行されていることがわかります。なぜですか。一度だけ実行されるようにするにはどうすればよいですか(コードをお願いします)?

4

2 に答える 2

2

ホイールがスクロールすると、OSはWM_MOUSEWHEELメッセージを送信します。wParamパラメータの上位ワードは、ホイールがどれだけ回転したかを示します。1回の「クリック」を回した場合、その値は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 に答える