Beispiel für Ink-Treffertest
In diesem Beispiel werden zwei Methoden zum Suchen von Ink anhand einer Bildschirmposition veranschaulicht.
In diesem Beispiel werden die folgenden Features verwendet:
- Verwenden eines Ink-Collectors
- Durchführen eines Treffertests
- Suchen des nächstgelegenen Punkts
Zugreifen auf die Ink-API
Verweisen Sie zunächst auf die Tablet PC-Klassen, die sich im Windows Vista oder Windows XP Tablet PC Edition Software Development Kit (SDK) befinden.
using Microsoft.Ink;
Behandeln von Formularlade- und Paint ereignissen
Der Load-Ereignishandler des Formulars:
- Erstellt ein InkCollector-Objekt ic für das Formular.
- Legt die CollectionMode-Eigenschaft des InkCollector-Objekts fest, um Gesten zu ignorieren.
- Aktiviert den InkCollector.
- Legt die AutoRedraw-Eigenschaft des InkCollector-Objekts auf TRUE fest.
// Create the InkCollector, and turn it on
ic = new InkCollector(Handle); // attach it to the form's frame window
// default to ink-enabled mode
mode = ApplicationMode.Ink;
ic.CollectionMode = CollectionMode.InkOnly;
// turn the collector on
ic.Enabled = true;ic.AutoRedraw = true;
Der Paint-Ereignishandler des Formulars überprüft den Anwendungsmodus:
- Im HitTest-Modus zeichnet er einen Kreis um den Cursor. Der aktive Stift wird in der handleHitTest-Methode der Anwendung festgelegt.
- Im NearestPoint-Modus zeichnet sie eine rote Linie zwischen dem Cursor und dem Punkt, der dem Cursor am nächsten ist. Der nächstgelegene Punkt wird in der handleRestPoint-Methode der Anwendung berechnet.
if( mode == ApplicationMode.HitTest)
{
e.Graphics.DrawEllipse(activepen, penPt.X - HitSize/2, penPt.Y - HitSize/2, HitSize, HitSize);
}
else if( mode == ApplicationMode.NearestPoint )
{
e.Graphics.DrawLine(redPen, penPt, nearestPt);
}
Dieses Beispiel verfügt über einen sehr einfachen Repaint-Algorithmus. Wenn die AutoRedraw-Eigenschaft auf TRUE festgelegt ist, zeichnet sich der Ink-Collector selbst neu, wenn das Formular neu gezeichnet wird. Um das Neuzeichnen des Formulars zu vereinfachen, verfolgt die Anwendung einen begrenzungsfeld, die invalidateRect-Membervariable, für den Bereich nach, in dem die Farbe hinzugefügt wird, die jedes Mal ungültig wird, wenn das Formular neu gezeichnet wird.
Behandeln von Menüereignissen
Der Exit-Befehl deaktiviert inkCollector, bevor die Anwendung beendet wird.
Der Befehl Ink aktualisiert den Anwendungsmodus und den Menüstatus, aktiviert den Ink-Collector und macht den zuvor gezeichneten Bereich des Formulars ungültig.
Mit den Befehlen Treffertest und Nächstes Punkt wird der Cursor geändert, der Anwendungsmodus und der Menüstatus aktualisiert, der Ink-Collector deaktiviert und der zuvor gezeichnete Bereich des Formulars ungültig.
The Clear! -Befehl deaktiviert inkCollector beim Ersetzen der InkCollector-Eigenschaft des InkCollector-Objekts durch ein neues Ink-Objekt, generiert ein Ink-Befehlsereignis und erzwingt eine Aktualisierung des Steuerelements.
Behandeln von Mausereignissen
Der MouseMove-Ereignishandler überprüft den Anwendungsmodus:
- Im Freihandmodus wird nichts ausgeführt, sodass Freihanddaten normal vom Freihandsammler gesammelt werden können.
- Im HitTest-Modus werden die Ereignisargumente an die handleHitTest-Methode der Anwendung gesendet.
- Im NearestPoint-Modus werden die Ereignisargumente an die handleRestPoint-Methode der Anwendung gesendet.
Durchführen eines Treffertests
Die handleHitTest-Methode der Anwendung erstellt zwei Punkte, die Cursorposition und einen Punkt HitSize Pixel, der vom Cursor entfernt ist, und konvertiert diese beiden Punkte dann von Pixeln in Freihandraumkoordinaten.
penPt = new Point(e.X, e.Y);
Point pt2 = new Point(e.X, e.Y);
Point pt3 = new Point(e.X + HitSize/2, e.Y);
using (Graphics g = CreateGraphics())
{
ic.Renderer.PixelToInkSpace(g, ref pt1);
ic.Renderer.PixelToInkSpace(g, ref pt2);
}
Anschließend verwendet das InkCollector-Objekt die Microsoft.Ink.Ink.HitTest()-Methode, um alle Striche innerhalb von pt3 zu suchen. X – pt2. X Freihandraumeinheiten des Cursors, pt2.
Strokes strokes = ic.Ink.HitTest(pt2, (float)(pt3.X - pt2.X));
Die handleHitTest-Methode legt dann die Stiftfarbe basierend darauf fest, ob Striche gefunden wurden, macht den InvalidateRect-Bereich ungültig, berechnet einen neuen Bereich, in dem der Treffertestkreis gezeichnet wird, und macht dann den neuen Bereich ungültig.
Suchen des nächstgelegenen Punkts
Die handleRestPoint-Methode der Anwendung erstellt zwei Punkte, die beide der Position des Cursors entsprechen. Einer dieser Punkte( pt) wird in Freihandspeicherplatz konvertiert und im Aufruf der NearestPoint-Methode des InkCollector-Freihandobjekts verwendet. Die NearestPoint-Methode gibt das Stroke-Objekt zurück, das dem Punkt am nächsten ist, und legt den Ausgabeparameter für den Gleitkommaindex fest.
using (Graphics g = CreateGraphics())
{
// Remeber pen location
Point inkPenPt = new Point(e.X, e.Y);
// Convert the pen location into a location in ink space
ic.Renderer.PixelToInkSpace(g, ref inkPenPt);
// ...
float fIndex;
Stroke stroke = ic.Ink.NearestPoint(inkPenPt, out fIndex);
Wenn keine Striche vorhanden sind, gibt die NearestPoint-Methode NULL zurück, und die Cursorposition wird als nächstgelegener Punkt verwendet. Andernfalls wird die Position auf dem Strich berechnet, der dem Gleitkommaindex entspricht.
Die Koordinaten des nächsten Punkts werden dann aus dem Freihandraum in Pixel konvertiert. Die handleRestPoint-Methode erklärt dann den InvalidateRect-Bereich ungültig, berechnet einen neuen Bereich, in dem die Linie zum nächsten Punkt gezeichnet wird, und macht auch den neuen Bereich ungültig.
Schließen des Formulars
Die Dispose-Methode des Formulars gibt das InkCollector-Objekt frei.