次の方法で共有


文字オートコンプリートのサンプル

オートコンプリート サンプルでは、認識アプリケーション プログラミング インターフェイス (API) を使用して、日本語で文字オートコンプリートを実装する方法を示します。

このサンプルでは、次の機能を使用します。

  • インク コレクターの使用
  • 認識エンジン コンテキストの使用

インク コレクターと認識エンジン コンテキストの初期化

InkCollector オブジェクトと InkRecognizerContext オブジェクトは、イベントを発生させるクラスとして宣言されています。

Dim WithEvents ic As InkCollector
Dim WithEvents rc As InkRecognizerContext

フォームの Load イベント ハンドラーは、インク コレクターを作成し、インク コレクターをピクチャ ボックスに関連付け、インクコレクションを有効にします。 イベント ハンドラーは、既定の日本語認識エンジンを読み込み、認識エンジン コンテキストの Guide プロパティと Strokes プロパティを初期化します。

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

既定の日本語認識エンジンの読み込み

InkRecognizers の GetDefaultRecognizer メソッドは、日本語の既定の認識エンジンを取得するために呼び出されます。 次に、認識エンジンが日本語をサポートしているかどうかを判断するために、IInkRecognizer オブジェクトの Languages プロパティがチェックされます。 その場合、認識エンジンの CreateRecognizerContext メソッドを使用して、フォームの認識エンジン コンテキストが生成されます。

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

Stroke イベントの処理

Stroke イベント ハンドラーは、最初に認識エンジン コンテキストでのバックグラウンド認識を停止します。 次に、認識エンジン コンテキストの Strokes プロパティに新しい ストロークを 追加します。 最後に、認識エンジン コンテキストの InkRecognizerCharacterAutoCompletionMode プロパティを設定し、3 文字のオートコンプリート モードのそれぞれに対して認識エンジン コンテキストの BackgroundRecognizeWithAlternates メソッドを呼び出します。 BackgroundRecognizeWithAlternates メソッド呼び出しの CustomData パラメーターは、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

代替イベントを使用した認識の処理

RecognitionWithAlternates イベントのハンドラーは、まず RecognitionStatus パラメーターを確認します。 認識でエラーが発生した場合、イベント ハンドラーは認識結果を無視します。 それ以外の場合、イベント ハンドラーは RecognitionResult パラメーターを適切な画像ボックスに追加し、結果文字列を保存します。 CustomData パラメーターは BackgroundRecognizeWithAlternates メソッドの呼び出しで設定され、認識エンジン コンテキストで使用された文字オートコンプリート モードを識別します。

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

フォームの描画

Paint イベント ハンドラーは、結果の画像ボックスをクリアし、保存された認識結果をそれらに追加します。

ストロークの削除

フォームの CmdClear_Click メソッドは Clear コマンドを処理します。 InkCollector が現在インクを収集している場合は、メッセージ ボックスが表示され、コマンドは無視されます。 それ以外の場合、イベント ハンドラーはバックグラウンド認識を停止し、認識エンジン コンテキストの Strokes プロパティをクリアし、フォームの InkDisp オブジェクトからストロークを削除します。 次に、イベント ハンドラーは、インク コレクターが関連付けられている画像ボックスを再描画し、認識文字列と画像ボックスをクリアします。

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