Partager via


Exemple de saisie semi-automatique de caractères

L’exemple de saisie semi-automatique montre comment implémenter la saisie semi-automatique de caractères en japonais à l’aide des interfaces de programmation d’application (API) de reconnaissance.

Les fonctionnalités suivantes sont utilisées dans cet exemple :

  • Utilisation d’un collecteur d’encre
  • Utilisation d’un contexte de module de reconnaissance

Initialisation du contexte du collecteur d’encre et du module de reconnaissance

Les objets InkCollector et InkRecognizerContext sont déclarés en tant que classes pouvant déclencher des événements.

Dim WithEvents ic As InkCollector
Dim WithEvents rc As InkRecognizerContext

Le gestionnaire d’événements Load du formulaire crée un collecteur d’encre, associe le collecteur d’encre à la zone image et active la collecte d’entrées manuscrites. Le gestionnaire d’événements charge ensuite le module de reconnaissance japonais par défaut et initialise les propriétés Guide et Strokes du contexte de reconnaissance.

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

Chargement du module de reconnaissance japonais par défaut

La méthode GetDefaultRecognizer de InkRecognizers est appelée pour récupérer le module de reconnaissance par défaut pour la langue japonaise. Ensuite, la propriété Languages de l’objet IInkRecognizer est vérifiée pour déterminer si le module de reconnaissance prend en charge la langue japonaise. Si c’est le cas, la méthode CreateRecognizerContext du module de reconnaissance est utilisée pour générer un contexte de module de reconnaissance pour le formulaire.

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

Gestion de l’événement Stroke

Le gestionnaire d’événements Stroke arrête d’abord la reconnaissance en arrière-plan sur le contexte du module de reconnaissance. Ensuite, il ajoute le nouveau trait à la propriété Strokes du contexte de reconnaissance. Enfin, il définit la propriété InkRecognizerCharacterAutoCompletionMode du contexte de reconnaissance et appelle la méthode BackgroundRecognizeWithAlternates du contexte de reconnaissance pour chacun des trois modes de saisie semi-automatique. Le paramètre CustomData de l’appel de méthode BackgroundRecognizeWithAlternates est utilisé pour identifier les résultats de reconnaissance retournés dans l’événement 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

Gestion de l’événement Reconnaissance avec alternates

Le gestionnaire de l’événement RecognitionWithAlternates vérifie d’abord le paramètre RecognitionStatus . En cas d’erreur de reconnaissance, le gestionnaire d’événements ignore les résultats de la reconnaissance. Sinon, le gestionnaire d’événements ajoute le paramètre RecognitionResult à la zone d’image appropriée et enregistre la chaîne de résultat. Le paramètre CustomData est défini dans l’appel à la méthode BackgroundRecognizeWithAlternates et identifie le mode de saisie semi-automatique de caractères utilisé par le contexte du module de reconnaissance.

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

Peindre le formulaire

Le gestionnaire d’événements Paint efface les zones d’image des résultats et y ajoute les résultats de reconnaissance enregistrés.

Suppression des traits

La méthode du CmdClear_Click formulaire gère la commande Clear. Si InkCollector collecte actuellement l’entrée manuscrite, une boîte de message s’affiche et la commande est ignorée. Sinon, le gestionnaire d’événements arrête la reconnaissance en arrière-plan, efface la propriété Strokes du contexte de reconnaissance et supprime les traits de l’objet InkDisp du formulaire. Ensuite, le gestionnaire d’événements redessine la zone d’image à laquelle le collecteur d’encre est associé, puis efface les chaînes de reconnaissance et les zones d’image.

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