Ejemplo de autocompletar de caracteres
En el ejemplo Autocompletar se muestra cómo implementar autocompletar de caracteres en japonés mediante las interfaces de programación de aplicaciones de reconocimiento (API).
En este ejemplo se usan las siguientes características:
- Uso de un recopilador de lápiz
- Uso de un contexto de reconocedor
Inicialización del recopilador de lápiz y el contexto del reconocedor
Los objetos InkCollector y InkRecognizerContext se declaran como clases que pueden generar eventos.
Dim WithEvents ic As InkCollector
Dim WithEvents rc As InkRecognizerContext
El controlador de eventos Load del formulario crea un recopilador de tintas, asocia el recopilador de tinta al cuadro de imagen y habilita la colección de tintas. A continuación, el controlador de eventos carga el reconocedor japonés predeterminado e inicializa las propiedades Guide y Strokes del contexto del reconocedor.
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
Carga del reconocedor japonés predeterminado
Se llama al método GetDefaultRecognizers de InkRecognizers para recuperar el reconocedor predeterminado para el idioma japonés. A continuación, se comprueba la propiedad Languages del objeto IInkRecognizer para determinar si el reconocedor admite el idioma japonés. Si es así, el método CreateRecognizerContext del reconocedor se usa para generar un contexto de reconocedor para el formulario.
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
Control del evento stroke
El controlador de eventos Stroke detiene primero el reconocimiento de fondo en el contexto del reconocedor. A continuación, agrega el nuevo trazo a la propiedad Strokes del contexto de reconocedor. Por último, establece la propiedad InkRecognizerCharacterAutoCompletionMode del contexto de reconocedor y llama al método BackgroundRecognizeWithAlternates del contexto de reconocedor para cada uno de los tres modos autocompletar de caracteres. El parámetro CustomData de la llamada al método BackgroundRecognizeWithAlternates se usa para identificar qué resultados de reconocimiento se devuelven en el evento RecognitionWithAlternates .
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
Control del reconocimiento con el evento Alternates
El controlador del evento RecognitionWithAlternates comprueba primero el parámetro RecognitionStatus . Si hay un error en el reconocimiento, el controlador de eventos omite los resultados del reconocimiento. De lo contrario, el controlador de eventos agrega el parámetro RecognitionResult al cuadro de imagen adecuado y guarda la cadena de resultado. El parámetro CustomData se establece en la llamada al método BackgroundRecognizeWithAlternates e identifica qué modo autocompletar de caracteres usó el contexto del reconocedor.
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
Pintar el formulario
El controlador de eventos Paint borra los cuadros de imagen de resultados y agrega los resultados de reconocimiento guardados a ellos.
Eliminar los trazos
El método del CmdClear_Click
formulario controla el comando Clear. Si inkCollector está recopilando tinta actualmente, se muestra un cuadro de mensaje y se omite el comando. De lo contrario, el controlador de eventos detiene el reconocimiento de fondo, borra la propiedad Strokes del contexto del reconocedor y elimina los trazos del objeto InkDisp del formulario. A continuación, el controlador de eventos vuelve a dibujar el cuadro de imagen al que está asociado el recopilador de tintas y borra las cadenas de reconocimiento y los cuadros de imagen.
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