1

我有 2 台内置多点触控触控板的笔记本电脑,一台是 Acer Switch,另一台是 ASUS Zenbook,一直在尝试让我的 Delphi 应用程序感知手势。

我曾认为触控板手势会映射到触摸屏手势,但这似乎并非如此,因为在触控板上进行缩放或平移不会触发 ongesture 事件。

触控板手势适用于 Firefox 等其他应用程序,因此必须能够捕获它们。

看起来两个手指垂直滚动被映射到 Delphi mousewheelup 和 mousewheel down 事件。我似乎无法弄清楚如何捕获其他类型的事件。

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

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

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

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

此外,触控板垂直平移会产生与鼠标滚轮滚动相反的滚动方向。

4

1 回答 1

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;
于 2016-07-22T08:12:49.367 回答