Gescanntes Papierformular für die Ink-Analyse
In diesem Beispiel wird gezeigt, wie Sie mit der Ink-Analyse eine Anwendung zum Ausfüllen von Formularen erstellen, bei der das Formular auf einem gescannten Papierformular basiert.
Gezeigte Features
Diese Beispielanwendung veranschaulicht die folgenden Funktionen der Freihandanalyse-API und der Windows Forms-Freihandsteuerelemente:
- Laden eines gescannten Papierformulars. Im Beispiel wird das Formular aus einem Bild im .png Format importiert.
- Sammeln und Rendern von Ink auf dem gescannten Formular.
- Verwenden eines InkAnalyzer-Objekts zum Analysieren der Handschrift.
- Generieren von AnalysisHintNode-Objekten zur Verbesserung der Handschriftergebnisse.
- Auffüllen von Textfeldern aus Analysehinweisen.
- Erstellen einer einfachen Textkorrektur.
Projektverweise
Das Beispiel ist als Windows Forms- oder Windows Presentation Foundation-Anwendung verfügbar. Die Windows Forms-Versionsverweise:
- Microsoft.Ink.dll
- Microsoft.Ink.Analysis.dll
Die Windows Presentation Foundation Version verweist IAWinFX.dll zusätzlich zu den Kern-Windows Presentation Foundation-DLLs.
Hinweis
Die Windows Presentation Foundation Version dieses Beispiels (im XAML-Verzeichnis) erfordert, dass die Windows Presentation Foundation-Erweiterungen für Microsoft Visual Studio 2005 auf dem System installiert sind.
Benutzeroberfläche
Die Benutzeroberfläche für diese Anwendung besteht aus einem TabControl-Objekt, dem zwei TabPage-Objekte zugeordnet sind: Freihandformular und konvertiertes Textformular. Die Registerkarte "Ink Form" enthält
- Ein Bereich, der ein Bild eines gescannten Papierformulars enthält, das für die Aufnahme von Telefonnachrichten verwendet wird.
- Ein Kontrollkästchen, in dem die Anwendung die Begrenzungen der Analysehinweise zeigt, wenn diese ausgewählt sind.
- Ein Paar von Schaltflächen ,Löschen und Analysieren', mit denen die Freihand aus dem Formular gelöscht und die Freihandanalyse initialisiert wird.
Das Formular für konvertierten Text enthält das gleiche Bild und ist die Seite, auf der die Anwendung den erkannten Text anzeigt. Wenn Sie auf Analysieren klicken, führt die Anwendung synchron eine Ink-Analyse durch, und die Erkennungsergebnisse werden auf der Registerkarte Konvertiertes Textformular angezeigt.
Funktionalität
Diese Anwendung verwendet inkOverlay, um das Schreiben zu ermöglichen. Das InkOverlay-Objekt eignet sich gut für Notizaufnahme und einfaches Scribbling. Die primäre Verwendung dieses Objekts besteht darin, Ink als Ink anzuzeigen. Die Hauptklasse für die Ink-Analyse ist die InkAnalyzer-Klasse. Wenn Sie die Analyze-Methode des InkAnalyzer-Objekts aufrufen, erfolgt die Ink-Analyse synchron.
Die Anwendung initialisiert zwei Arrays, eines von Zeichenfolgen und eines von Rechtecke. Das Zeichenfolgenarray factoidStrings besteht aus Factoid-Objekten, die als AnalysisHintNode-Objekte an InkAnalyzer übergeben werden. Die AnalysisHintNode-Objekte verzerren den InkAnalyzer auf eine bestimmte Eingabe. In diesem Beispiel werden datums-, uhrzeit- und telefon-Hinweise sowie einige andere Hinweise verwendet.
Jeder AnalysisHintNode ist einem bestimmten Bereich des Formulars zugeordnet. Die Bereiche werden durch das Array von Rechtecke dargestellt, rects . Durch Erstellen eines TextBox-Felds für jedes Rechteck gibt das Beispiel den erkannten Text an der richtigen Position aus.
private void InitHints()
{
// Instantiate the collection of TextBoxes.
this.textBoxes = new ArrayList();
// For each Rectangle in Rectangles
for (int i = 0; i < rects.Length; i++)
{
Rectangle rectangle = rects[i];
// Create an AnalysisHintNode with the bounds of the Rectangle. The bounds
// of an AnalysisHintNode gives clues to the handwriting recognizer about
// the way Strokes are grouped together.
AnalysisHintNode hint = this.analyzer.CreateAnalysisHint(rectangle);
// Set the corresponding Factoid on the AnalysisHintNode. This gives the
// recognizer clues about the meaning of the strokes within the
// AnalysisHintNode's region.
hint.Factoid = factoidStrings[i];
// Create a corresponding TextBox where the results of the analysis
// associated with this AnalysisHintNode will be displayed. Store the reference
// to the TextBox in the textBoxes Collection.
this.textBoxes.Add(InitTextBox(hint));
}
}
Danach geht es lediglich darum, einen Ereignishandler zu erstellen, der die Ink-Analyse auslöst, wenn der Benutzer auf Analysieren klickt.
private void UpdateTextBoxes()
{
// Get the AnalysisHintNodes that we previously added to the InkAnalyzer.
ContextNodeCollection hints = this.analyzer.GetAnalysisHints();
for (int i = 0; i < hints.Count; i++)
{
// Get the recognized string from the AnalysisHintNode
string analyzedString = ((AnalysisHintNode)hints[i]).GetRecognizedString();
// If we found a string, set the contents of the TextBox
// to that string.
if (analyzedString != null)
{
((TextBox)this.textBoxes[i]).Text = analyzedString;
}
}
}