-3

TMemo コンポーネントに関しては、ユーザーがマウスの WHEEL ボタンを離したことを検出する方法が見つかりません。標準の OnMouseUp イベントは、マウスのホイール ボタンには応答しません。

マウス ホイール ボタンのスクロール グリフ

4

1 に答える 1

3

上下の矢印が付いた小さな円は、中央のボタンが押されたときにスクロール機能を提供する VCLのパン ウィンドウです。

デフォルトのパン ウィンドウ は、マウスの動きを追跡できるようにメソッドTPanningWindow内でマウスをキャプチャし、StartPanningパンが停止するまでマウスを解放しません。これは別のクリックが原因です。そのため、メモは中ボタン アップ メッセージを受信せず、OnMouseUpイベントは発生しません。

OnMessage「アプリケーション」のハンドラーで、パン ウィンドウにディスパッチされる前にボタン アップ メッセージを検出できます。以下のサンプル コードはコンポーネントのOnMessageイベント ハンドラーにありTApplicationEvents、パン ウィンドウが「Memo1」をパンしているときにメッセージが取得されるかどうかをテストします。

uses
  imouse;

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if (Msg.message = WM_MBUTTONUP) and Assigned(Mouse.PanningWindow) and
    (Mouse.PanningWindow.HandleAllocated) and
    (Msg.hwnd = Mouse.PanningWindow.Handle) and
    (Mouse.PanningWindow is TPanningWindow) and
    (TPanningWindow(Mouse.PanningWindow).PanControl = Memo1) then

  // perform what's required

end;


または、独自のパン ウィンドウ クラスを に登録してMouse.PanningWindowClass、特定のメッセージのパン コントロールであることを通知することもできます。次に例を示します。

uses
  imouse;

type
  TMyPanningWindow = class(TPanningWindow)
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;

{ TMyPanningWindow }

procedure TMyPanningWindow.WndProc(var Msg: TMessage);
begin
  inherited;
  if (Msg.Msg = WM_MBUTTONUP) and (Assigned(PanControl)) then
    PanControl.Perform(Msg.Msg, Msg.WParam, Msg.LParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Mouse.PanningWindowClass := TMyPanningWindow;
end;
于 2013-07-29T00:01:10.020 に答える