Compartir a través de


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