Testbeispiel für Freihandtreffer
In diesem Beispiel werden zwei Methoden veranschaulicht, um Freihand zu finden, wenn eine Bildschirmposition angegeben wird.
In diesem Beispiel werden die folgenden Features verwendet:
- Verwenden eines Freihandsammlers
- Durchführen eines Treffertests
- Suchen des nächstgelegenen Punkts
Zugreifen auf die Freihand-API
Verweisen Sie zunächst auf die Tablet-PC-Klassen, die sich im Software Development Kit (SDK) für Windows Vista oder Windows XP Tablet PC Edition befinden.
using Microsoft.Ink;
Behandeln von Formularladen- und Malereignissen
Der Load-Ereignishandler des Formulars:
- Erstellt das InkCollector-Objekt ic für das Formular.
- Legt fest, dass die CollectionMode-Eigenschaft des InkCollector-Objekts Gesten ignoriert.
- 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 es einen Kreis um den Cursor. Der aktive Stift wird in der handleHitTest-Methode der Anwendung festgelegt.
- Im Modus NearestPoint zeichnet er eine rote Linie zwischen dem Cursor und dem dem Cursor nächstgelegenen Punkt. Der nächstgelegene Punkt wird in der handleNearestPoint-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 Neubemalungsalgorithmus. Wenn die AutoRedraw-Eigenschaft auf TRUE festgelegt ist, wird der Freihandsammler beim Neuzeichnen des Formulars neu gezeichnet. Um das Neuzeichnen des Formulars zu vereinfachen, verfolgt die Anwendung ein begrenzungsgebundenes Feld, die InvalidateRect-Membervariable, für den Bereich, in dem Farbe hinzugefügt wird, nach, die jedes Mal ungültig wird, wenn das Formular neu gezeichnet wird.
Behandeln von Menüereignissen
Der Befehl Exit deaktiviert den InkCollector vor dem Beenden der Anwendung.
Der Freihandbefehl aktualisiert den Anwendungsmodus und das Menü status, aktiviert den Freihandsammler und ungültig den zuvor gezeichneten Bereich des Formulars.
Sowohl die Befehle Treffertest als auch Nächster Punkt ändern den Cursor, aktualisieren den Anwendungsmodus und das Menü status, deaktivieren den Freihandsammler und ungültig den zuvor gezeichneten Bereich des Formulars.
Das Klare! der Befehl deaktiviert den InkCollector, während die InkCollector-Eigenschaft des InkCollector-Objekts durch ein neues Ink-Objekt ersetzt wird, generiert ein Freihandbefehlsereignis und erzwingt eine Aktualisierung des Steuerelements.
Behandeln von Mausereignissen
Der MouseMove-Ereignishandler überprüft den Anwendungsmodus:
- Im Freihandmodus wird nichts ausgeführt, sodass Freihand vom Freihandsammler normal erfasst werden kann.
- Im HitTest-Modus werden die Ereignisargumente an die handleHitTest-Methode der Anwendung gesendet.
- Im NearestPoint-Modus werden die Ereignisargumente an die handleNearestPoint-Methode der Anwendung gesendet.
Durchführen eines Treffertests
Die handleHitTest-Methode der Anwendung erstellt zwei Punkte, die Cursorposition und einen Punkt, 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 zu finden, die sich innerhalb von pt3 befinden. 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, ungültig den invalidateRect-Bereich, berechnet einen neuen Bereich, in dem der Treffertestkreis gezeichnet wird, und ungültigisiert dann den neuen Bereich.
Suchen des nächstgelegenen Punkts
Die handleNearestPoint-Methode der Anwendung erstellt zwei Punkte, die der Position des Cursors entsprechen: Einer dieser Punkte, pt, wird in Freihandraum konvertiert und beim Aufruf der NearestPoint-Methode des InkCollectors InkCollector-Objekts verwendet. Die NearestPoint-Methode gibt das Stroke-Objekt zurück, das dem Punkt am nächsten ist, und legt den Gleitkommaindexausgabeparameter fest.
using (Graphics g = CreateGraphics())
{
// Remember 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ächster Punkt verwendet. Andernfalls wird die Position auf dem Strich berechnet, die dem Gleitkommaindex entspricht.
Die nächstgelegenen Punktkoordinaten werden dann aus dem Freihandraum in Pixel konvertiert. Die handleNearestPoint-Methode ungültigt dann den invalidateRect-Bereich, berechnet eine neue Region, in der die Linie zum nächsten Punkt gezeichnet wird, und ungültigiert auch die neue Region.
Schließen des Formulars
Die Dispose-Methode des Formulars veräußert das InkCollector-Objekt .