There are two types of touch screens supported in Windows - one that detect gestures natively and uses special messages for them and another that uses mouse emulation and sends standard mouse messages on touch events. Delphi detects both these types and uses appropriate gesture engine internally. There is however a problem with mouse gesture engine in that it does not report distance that you swiped on the screen. This means that there could be false positives when user just wanted to press button but system detects it as gesture.
Fortunately it is pretty easy to replace mouse gesture engine with custom implementation. This implementation will be almost exactly the same as standard TMouseGestureEngine. Since it is a sealed class we cannot inherit from it so we will need to copy it completely to new unit from Vcl.Touch.Gestures and call it for example TMouseGestureEngineEx
Here are modifications that are needed for this class
// function that calculates distance between to points function Distance(Point1, Point2: TPoint): Integer; begin Result := Round(Sqrt(Sqr(Point1.X - Point2.X) + Sqr(Point1.Y - Point2.Y))); end; procedure TMouseGestureEngineEx.Notification(const Message: TMessage); // ..... if (LGestureList.Count > 0) and TGestureEngine.IsGesture(Points, LGestureList, [gtStandard] + [gtRecorded, gtRegistered], LEventInfo) then begin // add this line to set distance LEventInfo.Distance := Distance(Points[Low(Points)], Points[High(Points)]); BroadcastGesture(TargetControl, LEventInfo); end; // ... // registering our new gesture engine initialization TGestureEngine.DefaultEngineClass := TMouseGestureEngineEx; end.
Now in gesture event we can check EventInfo.Distance field
procedure TForm1.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); begin Label1.Caption := 'Distance ' + IntToStr(EventInfo.Distance); end;
This kind of calculation will work only for simple gestures because it calculates distance only between first and last points of swipe.