你如何访问Delphi-Berlin的触控板手势?

时间:2016-07-21 07:47:37

标签: delphi windows-10 gestures delphi-10.1-berlin

我有2台带内置多点触控功能的Trackpad笔记本电脑,一台是Acer Switch,另一台是华硕Zenbook,一直试图让我的Delphi应用程序手势识别。

我原以为触控板手势会映射到触摸屏手势,但这似乎并不是因为在触控板上捏合缩放或平移不会触发ongesture事件。

触控板手势可以在其他应用程序(如Firefox)上运行,因此必须能够捕获它们。

看起来双指垂直滚动被映射到Delphi鼠标滚轮和鼠标滚轮事件。我似乎无法弄清楚如何捕捉其他类型的事件。

关于如何做到这一点的任何线索?

更新 - 我在触控板手势上找到了MS文档,看起来它们已转换为鼠标滚轮事件。

https://msdn.microsoft.com/en-us/library/windows/hardware/dn614021(v=vs.85).aspx

Delphi鼠标捕获这些消息时似乎存在一个错误,因为它不捕获水平鼠标滚轮消息。

轨迹板垂直平移也会产生与鼠标滚轮滚动相反的滚动方向。

1 个答案:

答案 0 :(得分:0)

由于没有人设法回答这个问题,我想这是一个尚未解决的新问题,所以我进行了挖掘并提出了一个解决方案,其代码如下。

此代码处理平移和缩放的所有常见鼠标和触控板手势。所有这些手势都通过鼠标滚轮事件进行路由。额外重写的WndProc捕获Delphi事件管理器中缺少的水平事件。

procedure TmyFrame.WndProc(var Message:TMessage);
begin
  if Message.Msg=WM_MOUSEHWHEEL then
  begin
    if TWMMouseWheel(Message).Keys=0 then
    begin     //Scrollbars are assumed to have 1000 positions
      with HorzScrollBar do
        Position := Position+TWMMouseWheel(Message).WheelDelta div 10;
      Message.Result := 0;
    end else
      Message.Result := 1;
  end else
    inherited;
end;

procedure TmyFrame.FrameMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var n:integer;
begin
  Accum:=Accum+wheeldelta;   //We need an accumulator as trackpad deltas are little and often
  n:=Accum div 30;
  if n=0 then exit;
  Accum:=0;
  if ssctrl in shift then   //pinch zoom
  begin
    Zoomfunc(1-sign(WheelDelta)/50);  // 2% granularity ie 0.98 is -2% shrink
  end else
  if ssshift in shift then
  with HorzScrollBar do   //horiz using shift-mouswheel
    position:=position+n
  else
  with VertScrollBar do   //vert scroll
  begin
    position:=position-n;
  end;
  handled:=true;
end;