2016-07-21 25 views
1

Ich habe 2 Laptops mit eingebauten Multitouch-fähigen Trackpads, eines ist ein Acer Switch und das andere ein ASUS Zenbook und habe versucht, meine Delphi Apps Gesten bewusst zu machen.Wie greifen Sie auf Trackpad-Gesten in Delphi-Berlin zu?

Ich hatte gedacht, dass Trackpad-Gesten Touchscreen-Gesten zuordnen würde, aber dies scheint nicht so zu sein, als würde Pinch zum Zoomen oder Schwenken auf dem Trackpad das Ongesture-Ereignis nicht auslösen.

Die Trackpad-Gesten funktionieren auf anderen Anwendungen wie Firefox, so dass es möglich sein muss, sie zu erfassen.

Es scheint, dass der vertikale Scroll mit zwei Fingern in Delphi-Mausrad- und Mausrad-Abwärts-Ereignisse abgebildet wird. Ich kann nicht herausfinden, wie ich andere Arten von Ereignissen erfassen kann.

irgendwelche Hinweise, wie dies zu tun ist?

Update - Ich fand die MS-Dokumentation auf Trackpad-Gesten, es scheint, dass sie in Mausrad Ereignisse konvertiert werden.

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

Es scheint, es ist ein Fehler in der Maus Capturing dieser Nachrichten Delphi ist, dass es nicht Horizontal Mausrads Nachrichten nicht erfassen.

Auch die Trackpad-Vertikalpfanne erzeugt die entgegengesetzte Scrollrichtung zum Scrollrad des Mausrads.

Antwort

0

Da niemand es geschafft hat, dies zu beantworten, denke ich, es ist ein neues Problem, das nicht angesprochen wurde, also habe ich das Graben und kam mit einer Lösung, deren Code ist unten.

Dieser Code behandelt alle gängigen Maus- und Trackpadgesten des Panning und Zoomings. All diese Gesten werden durch Mausrad-Ereignisse geleitet. Das zusätzliche überschriebene WndProc erfasst die horizontalen Ereignisse, die im Delphi-Ereignismanager fehlen.

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;