2016-07-21 17 views
1

私は内蔵のマルチタッチ対応トラックパッドを備えた2台のノートPCを持っています.1台はAcerスイッチで、もう1台はASUS Zenbookで、私のDelphiアプリケーションのジェスチャーを認識させようとしています。Delphi-Berlinのトラックパッドジェスチャーにはどのようにアクセスしますか?

私は、トラックパッドジェスチャーがタッチスクリーンジェスチャーにマップされると考えていましたが、トラックパッド上のズームやパンニングの挟み込みがオンジェスチャーイベントをトリガーしないのでそうは見えません。

トラックパッドのジェスチャーは、Firefoxのような他のアプリケーションでも機能するので、キャプチャすることが可能でなければなりません。

2本の指の垂直スクロールがDelphiのマウスホイールアップとマウスホイールダウンイベントにマッピングされているようです。他の種類のイベントをキャプチャする方法を理解できないようです。

これを行う方法についての手がかりは?

更新 - トラックパッドのジェスチャーに関するMSのドキュメントが見つかりました。マウスホイールイベントに変換されているようです。

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

水平マウスホイールのメッセージをキャプチャしていないという点で、これらのメッセージのDelphiのマウスのキャプチャにバグがあると表示されます。

また、トラックパッドの垂直パンは、マウスホイールスクロールとは反対のスクロール方向を生成します。

答えて

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; 
関連する問題