09.キャンバスに描いた文字を認識する
inkCanvasでは、文字を認識することも可能です。文字認識を利用するには下準備が必要です。
最初に C:\Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 にあるIAWinFX.dll, IACore.dll を参照設定に追加します。
次に、C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin にある IALoader.dll を参照設定に追加します。
最後に、System.Windows.Ink を Import(C#ではUsing)します。
文字を認識するには InkAnalyzer クラスのインスタンスを使用します。
はじめに、ジェスチャ認識したストロークを AddStrokes メソッドで追加し、ストロークを文字として認識するようにSetStrokesTypeメソッドに StrokeType.Writing を指定します。
次に、Analyze メソッドを使用して認識した文字の解析を実行します。
解析を実行すると、描画されたストロークに近い文字の候補が作成されるので、GetRecognizedString メソッドで第1候補の文字を取得します。そのほかの認識候補は GetAlternates メソッドを実行することで取得することが可能です。
下記はキャンバスに描いた文字を認識する例です。

<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Name="btnAnalyze" Content="文字認識"/>
</StackPanel>
<InkCanvas Name="InkCanvas1" EditingMode="Ink" />
</StackPanel>
'下記を追加
Imports System.Windows.Ink
' キャンバスに描かれた文字を認識する
Private Sub btnAnalyze_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAnalyze.Click
Dim theInkAnalyzer As New InkAnalyzer()
'キャンバスに描かれた文字を認識するためにアナライザにストロークをセット
theInkAnalyzer.AddStrokes(InkCanvas1.Strokes)
theInkAnalyzer.SetStrokesType(InkCanvas1.Strokes, StrokeType.Writing)
'文字を解析
theInkAnalyzer.Analyze()
'文字を解析した結果の第1候補を表示する
MessageBox.Show(theInkAnalyzer.GetRecognizedString())
'その他の候補を表示する
Dim alternates As AnalysisAlternateCollection = theInkAnalyzer.GetAlternates()
For Each alternate In alternates
MessageBox.Show(alternate.RecognizedString)
Next
End Sub
// 下記を追加
using System.Windows.Ink;
/// キャンバスに描かれた文字を認識する
private void btnAnalyze_Click(object sender, RoutedEventArgs e)
{
InkAnalyzer theInkAnalyzer = new InkAnalyzer();
// キャンバスに描かれた文字を認識するためにアナライザにストロークをセット
theInkAnalyzer.AddStrokes(inkCanvas1.Strokes);
theInkAnalyzer.SetStrokesType(inkCanvas1.Strokes, StrokeType.Writing);
// 文字を解析
theInkAnalyzer.Analyze();
// 文字を解析した結果の第1候補を表示する
MessageBox.Show(theInkAnalyzer.GetRecognizedString());
// その他の候補を表示する
AnalysisAlternateCollection alternates = theInkAnalyzer.GetAlternates();
foreach (var alternate in alternates)
MessageBox.Show(alternate.RecognizedString);
}
文字を認識するには InkAnalyzer クラスを使用し、解析には Analyze メソッドを使用する。
認識結果の第1候補を取得するには GetRecognizedString メソッドを使用する。
10.クリップボードを使用する
InkCanvas コントロールはクリップボードを使用することができ、描画したストロークをコピー、切り取り、貼り付けすることができます。
クリップボードを使用する際は、最初に EditingMode プロパティに Select を指定し、ストロークを選択できる状態にしておきます。
コピーをする場合は CopySelection メソッドを、切り取りをする場合は CutSelection メソッドを、貼り付けをする場合は Paste メソッドを使用します。
| メソッド名 | 説明 |
| CopySelection | 選択されたストロークをコピーする |
| CutSelection | 選択されたストロークを切り取る |
| Paste | クリップボードにあるストロークを貼り付ける |
下記は、クリップボードを使用する例です。
[コピー]ボタンが押されると、選択されたストロークをコピーし、[カット]ボタンをクリックすると選択されたストロークを切り取ります。また、右クリックをするとクリップボードにあるストロークを貼り付けます。

<StackPanel>
<StackPanel Orientation="Horizontal">
<Button Name="btnInk" Content="インク"/>
<Button Name="btnSelect" Content="選択"/>
<Button Name="btnCopy" Content="コピー" Margin="5,0,0,0"/>
<Button Name="btnCut" Content="カット" />
</StackPanel>
<InkCanvas Name="InkCanvas1" EditingMode="Ink" />
</StackPanel>
' [インク]ボタンクリック時の処理
Private Sub btnInk_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnInk.Click
'インクを使用できる状態にする
InkCanvas1.EditingMode = InkCanvasEditingMode.Ink
End Sub
' [選択]ボタンクリック時の処理
Private Sub btnSelect_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSelect.Click
'描画されたストロークを選択できる状態にする
InkCanvas1.EditingMode = InkCanvasEditingMode.Select
End Sub
' [コピー]ボタンクリック時の処理
Private Sub btnCopy_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCopy.Click
'選択されたストロークをクリップボードにコピー
InkCanvas1.CopySelection()
End Sub
' [カット]ボタンクリック時の処理
Private Sub btnCut_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCut.Click
'選択されたストロークをカットしてクリップボードにコピー
InkCanvas1.CutSelection()
End Sub
' マウスダウン時の処理
Private Sub InkCanvas1_PreviewMouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles InkCanvas1.PreviewMouseDown
'マウスの右ボタンが押されたか?
If e.RightButton = MouseButtonState.Pressed Then
'右ボタンが押された位置を取得
Dim position As System.Windows.Point
position = e.GetPosition(InkCanvas1)
'貼り付け可能か?
If InkCanvas1.CanPaste() Then
'右ボタンが押された位置に貼り付け
InkCanvas1.Paste(position)
End If
End If
End Sub
// [インク]ボタンクリック時の処理
private void btnInk_Click(object sender, RoutedEventArgs e)
{
//インクを使用できる状態にする
inkCanvas1.EditingMode = InkCanvasEditingMode.Ink;
}
// [選択]ボタンクリック時の処理
private void btnSelect_Click(object sender, RoutedEventArgs e)
{
// 描画されたストロークを選択できる状態にする
inkCanvas1.EditingMode = InkCanvasEditingMode.Select;
}
// [コピー]ボタンクリック時の処理
private void btnCopy_Click(object sender, RoutedEventArgs e)
{
// 選択されたストロークをクリップボードにコピー
inkCanvas1.CopySelection();
}
// [カット]ボタンクリック時の処理
private void btnCut_Click(object sender, RoutedEventArgs e)
{
// 選択されたストロークをカットしてクリップボードにコピー
inkCanvas1.CutSelection();
}
// マウスダウン時の処理
private void inkCanvas1_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
// マウスの右ボタンが押されたか?
if (e.RightButton == MouseButtonState.Pressed)
{
// 右ボタンが押された位置を取得
Point position;
position = e.GetPosition(inkCanvas1);
// 貼り付け可能か?
if (inkCanvas1.CanPaste())
// 右ボタンが押された位置に貼り付け
inkCanvas1.Paste(position);
}
}
クリップボードを使用するには EditingModeプロパティに Selectを指定しておき、CopySelection, CutSelection, Paste メソッドなどを必要に応じて使用する。
