Beispiel für automatische Vervollständigung von Zeichen
Im AutoVervollständigen-Beispiel wird veranschaulicht, wie Die automatische Vervollständigung von Zeichen auf Japanisch mithilfe der ApIs (Application Programming Interface, Anwendungsprogrammierschnittstellen) implementiert wird.
In diesem Beispiel werden die folgenden Features verwendet:
- Verwenden eines Ink-Collectors
- Verwenden eines Wiedererkennungskontexts
Initialisieren des Ink Collector- und Recognizer-Kontexts
Die Objekte InkCollector und InkRecognizerContext werden als Klassen deklariert, die Ereignisse erstellen können.
Dim WithEvents ic As InkCollector
Dim WithEvents rc As InkRecognizerContext
Der Load-Ereignishandler des Formulars erstellt einen Ink-Collector, ordnet den Ink-Collector dem Bildfeld zu und aktiviert die Sammlung von Ink-Daten. Der Ereignishandler lädt dann die japanische Standard-Recognizer-Funktion und initialisiert die Guide- und Strokes-Eigenschaften des Recognizer-Kontexts.
Private Sub Form_Load()
' Set the ink collector to work in the small frame window
Set ic = New InkCollector ic.hWnd = fraBox.hWnd ic.Enabled = True
' Get the Japanese recognizer
LoadRecognizer
' Initialize the recognizer context
Dim Guide As New InkRecognizerGuide
Dim FrameRectangle As New InkRectangle
Dim Top As Long
Dim Bottom As Long
Dim Left As Long
Dim Right As Long
Top = 0
Left = 0
Bottom = fraBox.ScaleHeight
Right = fraBox.ScaleWidth
ic.Renderer.PixelToInkSpace Me.hdc, Top, Left
ic.Renderer.PixelToInkSpace Me.hdc, Bottom, Right
FrameRectangle.Bottom = Bottom
FrameRectangle.Top = Top
FrameRectangle.Left = Left
FrameRectangle.Right = Right
Guide.Columns = 1
Guide.Rows = 1
Guide.Midline = -1 ' Do not use midline
Guide.DrawnBox = FrameRectangle
Guide.WritingBox = FrameRectangle
Set rc.Guide = Guide
' Set the strokes collection on the recognizer context
Set ink = ic.ink Set rc.Strokes = ic.ink.Strokes
End Sub
Laden der japanischen Standard-Recognizer-2016
Die GetDefaultRecognizer-Methode der InkRecognizers wird aufgerufen, um die Standard-Recognizer-Methode für die japanische Sprache abzurufen. Als Nächstes wird die Languages-Eigenschaft des IInkRecognizer-Objekts überprüft, um zu bestimmen, ob die Recognizer die japanische Sprache unterstützt. In diesem Beispiel wird die CreateRecognizerContext-Methode der Recognizer-Klasse verwendet, um einen Recognizer-Kontext für das Formular zu generieren.
Private Sub LoadRecognizer()
On Error GoTo NoRecognizer
' Get a Japanese recognizer context
Dim recos As New InkRecognizers
Dim JapaneseReco As IInkRecognizer
Set JapaneseReco = recos.GetDefaultRecognizer(&H411)
If JapaneseReco Is Nothing Then
MsgBox "Japanese Recognizers are not installed on this system. Exiting."
End
End If
' Check that this is indeed a Japanese recognizer
Dim IsJapanese As Boolean
Dim lan As Integer
IsJapanese = False
For lan = LBound(JapaneseReco.Languages) To UBound(JapaneseReco.Languages)
If JapaneseReco.Languages(lan) = &H411 Then
IsJapanese = True
End If
Next lan
If Not IsJapanese Then
MsgBox "Japanese Recognizers are not installed on this system. Exiting."
End
End If
Set rc = JapaneseReco.CreateRecognizerContext
Exit Sub
NoRecognizer:
MsgBox "Japanese Recognizers are not installed on this system. Exiting."
End
End Sub
Behandeln des Strich-Ereignisses
Der Stroke-Ereignishandler hält zuerst die Hintergrunderkennung im Erkennungskontext an. Anschließend wird der neue Strich der Strokes-Eigenschaft des Recognizer-Kontexts hinzufügt. Schließlich wird die Eigenschaft InkRecognizerCharacterAutoCompletionMode des Kontexts für die InkRecognizerCharacterAutoCompletionMode festgelegt und die BackgroundRecognizeWithAlternates-Methode des Recognizer-Kontexts für jeden der drei Zeichen-AutoVervollständigen-Modi aufruft. Der CustomData-Parameter des BackgroundRecognizeWithAlternates-Methodenaufrufs wird verwendet, um zu identifizieren, welche Erkennungsergebnisse im RecognitionWithAlternates-Ereignis zurückgegeben werden.
Private Sub ic_Stroke(ByVal Cursor As MSINKAUTLib.IInkCursor, ByVal Stroke As MSINKAUTLib.IInkStrokeDisp, Cancel As Boolean)
' Stop the unfinished recognition processes
rc.StopBackgroundRecognition
' Add the new stroke
rc.Strokes.Add Stroke
' Get a result for all three CAC modes
rc.CharacterAutoCompletionMode = IRCACM_Full rc.BackgroundRecognizeWithAlternates 0 rc.CharacterAutoCompletionMode = IRCACM_Prefix rc.BackgroundRecognizeWithAlternates 1 rc.CharacterAutoCompletionMode = IRCACM_Random rc.BackgroundRecognizeWithAlternates 2
End Sub
Behandeln des Ereignisses "Erkennung mit Alternativen"
Der Handler für das RecognitionWithAlternates-Ereignis überprüft zuerst den RecognitionStatus-Parameter. Wenn bei der Erkennung ein Fehler auftritt, ignoriert der Ereignishandler die Erkennungsergebnisse. Andernfalls fügt der Ereignishandler dem entsprechenden Bildfeld den RecognitionResult-Parameter hinzu und speichert die Ergebniszeichenfolge. Der CustomData-Parameter wird im Aufruf der BackgroundRecognizeWithAlternates-Methode festgelegt und identifiziert, welches Zeichen der AutoVervollständigen-Modus vom Kontext der Wiedererkennung verwendet wurde.
Private Sub rc_RecognitionWithAlternates(ByVal RecognitionResult As MSINKAUTLib.IInkRecognitionResult, ByVal vCustomParam As Variant, ByVal RecognitionStatus As MSINKAUTLib.InkRecognitionStatus)
' Get the alternates from the recognition result
' and display them in the right place
Dim ResultString As String
Dim alts As IInkRecognitionAlternates
Dim alt As IInkRecognitionAlternate
On Error GoTo EndFunc
If RecognitionStatus = IRS_NoError Then
' Fill a string with all the characters for this CAC mode
Set alts = RecognitionResult.AlternatesFromSelection
For Each alt In alts
ResultString = ResultString + alt.String
Next alt
' Display the string
Dim r As RECT
r.Left = 0
r.Top = 0
r.Right = 1000
r.Bottom = 1000
PctResult(vCustomParam).Cls
DrawText PctResult(vCustomParam).hdc, StrPtr(ResultString), Len(ResultString), r, 0
If vCustomParam = 0 Then
FullCACText = ResultString
Else
If vCustomParam = 1 Then
PrefixCACText = ResultString
Else
If vCustomParam = 2 Then
RandomCACText = ResultString
End If
End If
End If
End If
Exit Sub
EndFunc:
MsgBox Err.Description
End Sub
Malen des Formulars
Der Paint-Ereignishandler gibt die Ergebnisbildfelder frei und fügt ihnen die gespeicherten Erkennungsergebnisse hinzu.
Löschen der Striche
Die -Methode des CmdClear_Click Formulars verarbeitet den Clear-Befehl. Wenn der InkCollector derzeit InkCollector sammelt, wird ein Meldungsfeld angezeigt, und der Befehl wird ignoriert. Andernfalls beendet der Ereignishandler die Hintergrunderkennung, löscht die Strokes-Eigenschaft des Erkennungskontexts und löscht die Striche aus dem InkDisp-Objekt des Formulars. Anschließend wird das Bildfeld, dem der Freiksammler zugeordnet ist, vom Ereignishandler neu gedrammt, und die Erkennungszeichenfolgen und Bildfelder werden wieder frei.
If Not (ic.CollectingInk) Then
' Stop the unfinished recognition processes
rc.StopBackgroundRecognition
' ...
Set rc.Strokes = Nothing
' Delete all the strokes from the ink object
ic.Ink.DeleteStrokes strokesToDelete
' Refresh the window
fraBox.Refresh
' refresh the recognizer context
Set rc.Strokes = ic.Ink.Strokes
' Clear the result strings
FullCACText = ""
PrefixCACText = ""
RandomCACText = ""
' Clear the result windows
PctResult(0).Cls
PctResult(1).Cls
PctResult(2).Cls
Else
MsgBox "Cannot clear ink while the ink collector is busy."
End If