SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight/WPFで使える逆引きTips集

Silverlight/WPFで使える逆引きTips集
――インクキャンバス機能

(6) InkCanvasコントロール

ダウンロード InkCanvas_WPF_VB.zip (2.0 MB)
ダウンロード InkCanvas_WPF_CS.zip (72.0 KB)

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 メソッドを実行することで取得することが可能です。

 下記はキャンバスに描いた文字を認識する例です。

キャンバスに描いた文字を認識する
キャンバスに描いた文字を認識する
XAMLの例
<StackPanel>
    <StackPanel Orientation="Horizontal">
        <Button Name="btnAnalyze" Content="文字認識"/>
    </StackPanel>
    <InkCanvas Name="InkCanvas1" EditingMode="Ink" />
</StackPanel>
VBの例
'下記を追加
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
C#の例
// 下記を追加
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 クリップボードにあるストロークを貼り付ける

 下記は、クリップボードを使用する例です。

 [コピー]ボタンが押されると、選択されたストロークをコピーし、[カット]ボタンをクリックすると選択されたストロークを切り取ります。また、右クリックをするとクリップボードにあるストロークを貼り付けます。

クリップボードを使用する例
クリップボードを使用する例
XAMLの例
<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>
VBの例
' [インク]ボタンクリック時の処理
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
C#の例
// [インク]ボタンクリック時の処理
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 メソッドなどを必要に応じて使用する。

次のページ
11.キャンバスに描いた絵を画像ファイルとして保存する

この記事は参考になりましたか?

Silverlight/WPFで使える逆引きTips集連載記事一覧

もっと読む

この記事の著者

HIRO(ヒロ)

HIRO's.NETのHIROです。とある半導体工場のSEです。VB.NET, C#, PowerShellによるプログラミングを楽しんでいます。最近はBlog でPowerShellについて書いています。2008/07/07にPowerShell from Japan!!というサイトを立ち上げまし...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5666 2011/01/13 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー