德尔福:检测鼠标滚轮按钮

时间:2013-07-28 22:27:07

标签: delphi

关于TMemo组件,我找不到一种方法来检测用户何时释放鼠标上的WHEEL按钮。标准的OnMouseUp事件不响应鼠标的滚轮按钮。

Mouse wheel button scroll glyph

1 个答案:

答案 0 :(得分: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;