delphi 处理鼠标双击自定义

sigwle7e  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(259)

一位用户定制了他的鼠标,这样他就可以使用鼠标滚轮或特殊的Logitech按钮双击鼠标。他报告说我的软件只识别标准的左键双击。关于我没有提供什么建议吗?如何修复?
软件是 Delphi Alexandria,VCL,Windows。
TDrawgrid的这个子代通过将OnDblClick设置为Create中的自定义过程来查找双击:

OnDblClick := DoDoubleClick;

procedure DoDoubleClick(Sender: TObject);


procedure TWS_Grid.DoDoubleClick(Sender: TObject);
begin
  if fGridState <> gsNormal then
    exit;
  if Assigned(On_DoubleClickCell) then
  begin
    On_DoubleClickCell(self, Col, Row);
    just_double_clicked := true;
  end;
end;

On_DoubleClickcell可以很好地处理普通的左键双击。但是,我自己的由OnMouseDown调用的CheckMouseDown不接受除mbLeft之外的任何其他按钮:

procedure TWS_Grid.CheckMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: integer);
var
  ACol, AGridRow: integer;
begin
  if (Button <> mbLeft) or (not(fGridState in [gsNormal, gsSelecting])) then
    exit;
...

我是否需要以某种方式计算OnMouseDown或OnMouseUp中的点击次数?
谢谢

ee7vknir

ee7vknir1#

要检查OnMouseDown事件中的双击,应检查上述事件返回的Shift State
双击时(无论使用哪个按钮执行双击),换档状态将包括ssDouble
因此,使用Button和Shift信息的组合来检测所需的双击执行。

procedure TForm1.DrawGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssDouble in Shift then
  begin
    case Button of
      TMouseButton.mbLeft: MessageDlg('Left button double click', mtInformation, [mbOK],0);
      TMouseButton.mbRight: MessageDlg('Right button double click', mtInformation, [mbOK],0);
      TMouseButton.mbMiddle: MessageDlg('Mouse wheel double click', mtInformation, [mbOK],0);
    end;
  end;
end;

或者,您也可以尝试通过处理特定窗口接收的WM_LBUTTONDBLCLK窗口消息来检测双击。

相关问题