Condividi tramite


Esempio di completamento automatico dei caratteri

L'esempio di completamento automatico illustra come implementare il completamento automatico dei caratteri in giapponese usando le API di programmazione dell'applicazione di riconoscimento.

In questo esempio vengono usate le funzionalità seguenti:

  • Utilizzo di un collettore di inchiostro
  • Uso di un contesto di riconoscimento

Inizializzazione del Collettore di Inchiostro e del Contesto di Riconoscimento

Gli oggetti InkCollector e InkRecognizerContext vengono dichiarati come classi che possono generare eventi.

Dim WithEvents ic As InkCollector
Dim WithEvents rc As InkRecognizerContext

Il gestore eventi Load del modulo crea un collettore di inchiostro, associa il collettore di inchiostro al picture box e abilita la raccolta di inchiostro. Il gestore eventi carica quindi il sistema di riconoscimento giapponese predefinito e inizializza le proprietà Guide e Strokes del contesto di riconoscimento.

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

Caricamento del riconoscimento giapponese predefinito

Il metodo GetDefaultRecognizer delInkRecognizersviene chiamato per recuperare il riconoscimento predefinito per la lingua giapponese. Viene quindi verificata la proprietà Languages dell'oggetto IInkRecognizer per determinare se il riconoscitore supporta la lingua giapponese. In caso affermativo, il metodo CreateRecognizerContext viene usato per generare un contesto di riconoscimento per il modulo.

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

Gestione dell'evento Stroke

Il gestore eventistrokeinterrompe prima il riconoscimento dello sfondo nel contesto del riconoscitore. Aggiunge quindi il nuovo tratto alla proprietà Strokes del contesto di riconoscimento. Infine, imposta la proprietà del contesto di riconoscimento in InkRecognizerCharacterAutoCompletionMode e chiama il metodo BackgroundRecognizeWithAlternates del contesto di riconoscimento per ciascuna delle tre modalità di completamento automatico dei caratteri. Il parametro CustomData della chiamata al metodo BackgroundRecognizeWithAlternates viene usato per identificare i risultati del riconoscimento restituiti nell'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

Gestione dell'evento di riconoscimento con opzioni alternative

Il gestore per l'evento RecognitionWithAlternates controlla innanzitutto il parametro RecognitionStatus. Se si verifica un errore nel riconoscimento, il gestore eventi ignora i risultati del riconoscimento. In caso contrario, il gestore eventi aggiunge il parametro RecognitionResult alla casella di immagine appropriata e salva la stringa di risultato. Il parametro CustomData viene impostato nella chiamata al metodo BackgroundRecognizeWithAlternates e identifica la modalità di completamento automatico dei caratteri usata dal contesto di riconoscimento.

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

Pittura della forma

Il gestore dell'evento Paint cancella le caselle foto dei risultati e vi aggiunge i risultati del riconoscimento salvati.

Eliminazione delle pennellate

Il metodo CmdClear_Click del modulo gestisce il comando Clear. Se l'InkCollector sta attualmente raccogliendo inchiostro, viene visualizzato un messaggio di notifica e il comando viene ignorato. In caso contrario, il gestore eventi interrompe il riconoscimento in background, cancella la proprietà tratti del contesto del riconoscitore ed elimina i tratti dall'oggetto InkDisp del form. Il gestore eventi ridisegna quindi il picture box a cui è associato l'ink collector e cancella le stringhe di riconoscimento e i picture boxes.

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