我有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鼠标捕获这些消息时似乎存在一个错误,因为它不捕获水平鼠标滚轮消息。
轨迹板垂直平移也会产生与鼠标滚轮滚动相反的滚动方向。
答案 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;