たくさんのドキュメントを読んだ後、正しい方法は次のとおりであることがわかりました。
EventInfo.GestureIDをインターセプトして、私の場合はズームコマンドで必要なコマンドを識別します。その後、EventInfo.Flagsを読み取り、それがgfBeginであるかどうかを識別して、最初のロケーションポイント(x、y)と最初のロケーションポイントをキャッシュできるようにします。距離とフラグが異なる場合、gfBeginは、firstpointとcurrentpoint(EventInfo.Location)を使用して計算を実行します。
基本的なコマンドは次のようになります。
case EventInfo.GestureID of
igiZoom:
begin
if (EventInfo.Flags = [gfBegin]) then
begin
FLastDistance := EventInfo.Distance;
FFirstPoint.X := EventInfo.Location.X;
FFirstPoint.Y := EventInfo.Location.Y;
FFirstPoint := ScreenToClient(FFirstPoint);
if (FSecondPoint.X = 0) and (FSecondPoint.Y = 0) then
begin
FSecondPoint.X := EventInfo.Location.X + 10;
FSecondPoint.Y := EventInfo.Location.Y + 10;
FSecondPoint := ScreenToClient(FSecondPoint);
end;
//ZoomCenter is a local TPoint var
ZoomCenter.Create(((FFirstPoint.X + FSecondPoint.X) div 2),
((FFirstPoint.Y + FSecondPoint.Y) div 2));
//Apply the zoom to the object
FDrawingObject.Zoom(EventInfo.Distance / FLastDistance, ZoomCenter.X, ZoomCenter.Y);
Invalidate;
end
else
begin
FSecondPoint.X := EventInfo.Location.X;
FSecondPoint.Y := EventInfo.Location.Y;
FSecondPoint := ScreenToClient(FSecondPoint);
ZoomCenter.Create(((FFirstPoint.X + FSecondPoint.X) div 2),
((FFirstPoint.Y + FSecondPoint.Y) div 2));
FDrawingObject.Zoom(EventInfo.Distance / FLastDistance, ZoomCenter.X, ZoomCenter.Y);
Invalidate;
//Update with the new values for next interaction
FFirstPoint := FSecondPoint;
FLastDistance := EventInfo.Distance;
end;
Windows v7.0 SDKで利用可能なc#で記述されたサンプルコードがあります。これは参照として使用でき、多くのことを助けてくれます。