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)

08.ジェスチャで認識した情報をもとに図形を描画する

 この Tips は「07.ジェスチャを認識する」を踏まえた上でご覧ください。

 InkCanvasでジェスチャを認識すると、Gesture イベントの e 引数の Stroke プロパティを使用して、ストロークが動いた最大幅、高さ、位置といった情報を取得することができます。そこで、四角形を認識した場合は、「どのような高さや幅の四角形がどの位置に描かれたのか」といった情報を取得して Rectangle クラスを使用すれば、ユーザーが描いた四角形に近い、きれいな四角形を描画することができます。

 同様にして、Ellipse クラスを利用することで、ユーザーが描いた円(楕円)に近い、きれいな円(楕円)を描画することが可能です。

 下記は、ジェスチャで認識した情報をもとに図形を描画する例です。

ジェスチャで認識した情報を元に図形を描画する例
ジェスチャで認識した情報を元に図形を描画する例
XAMLの例
<InkCanvas Name="InkCanvas1" EditingMode="InkAndGesture" />
VBの例
'下記をインポート
Imports System.Windows.Ink
Imports System.Collections.ObjectModel


Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    'InkAndGestureモードに設定する
    InkCanvas1.EditingMode = InkCanvasEditingMode.InkAndGesture
End Sub

' ジェスチャを認識
Private Sub InkCanvas1_Gesture(ByVal sender As System.Object, ByVal e As System.Windows.Controls.InkCanvasGestureEventArgs) Handles InkCanvas1.Gesture
    Dim gestureResults As ReadOnlyCollection(Of GestureRecognitionResult)
    gestureResults = e.GetGestureRecognitionResults()

    ' ジェスチャを認識したか?
    If gestureResults(0).RecognitionConfidence = _
       RecognitionConfidence.Strong Then

        '認識時の領域(外枠)サイズを取得
        Dim strokeRect As Rect = e.Strokes.GetBounds

        Select Case gestureResults(0).ApplicationGesture
            Case ApplicationGesture.Circle  '楕円(円)認識時
                '認識した外枠サイズに合わせて円を作成する
                Dim ellipse As New Ellipse()
                ellipse.Width = strokeRect.Width
                ellipse.Height = strokeRect.Height
                ellipse.SetValue(Controls.InkCanvas.LeftProperty, strokeRect.X)
                ellipse.SetValue(Controls.InkCanvas.TopProperty, strokeRect.Y)
                ellipse.Stroke = Brushes.Black

                '作成した円をキャンバスに追加
                InkCanvas1.Children.Add(ellipse)

            Case ApplicationGesture.Square  '四角形認識時
                '認識した外枠サイズに合わせて四角形を作成する
                Dim square As New Rectangle
                square.Width = strokeRect.Width
                square.Height = strokeRect.Height
                square.SetValue(Controls.InkCanvas.LeftProperty, strokeRect.X)
                square.SetValue(Controls.InkCanvas.TopProperty, strokeRect.Y)
                square.Stroke = Brushes.Black

                '作成した四角形をキャンバスに追加
                InkCanvas1.Children.Add(square)
        End Select

    End If
End Sub
C#の例
// 下記を追加
using System.Windows.Ink;
using System.Collections.ObjectModel;


private void Window_Loaded(object sender, RoutedEventArgs e)
{
    // InkAndGestureモードに設定する
    inkCanvas1.EditingMode = InkCanvasEditingMode.InkAndGesture;
}

// ジェスチャを認識
private void inkCanvas1_Gesture(object sender, InkCanvasGestureEventArgs e)
{
    ReadOnlyCollection<gesturerecognitionresult> gestureResults;
    gestureResults = e.GetGestureRecognitionResults();

    if (gestureResults[0].RecognitionConfidence ==
        RecognitionConfidence.Strong)
    {
        // 認識時の領域(外枠)サイズを取得
        Rect strokeRect = e.Strokes.GetBounds();

        switch (gestureResults[0].ApplicationGesture)
        {
            case ApplicationGesture.Circle: // 楕円(円)認識時
                // 認識した外枠サイズに合わせて円を作成する
                Ellipse ellipse = new Ellipse();
                ellipse.Width = strokeRect.Width;
                ellipse.Height = strokeRect.Height;
                ellipse.SetValue(System.Windows.Controls.InkCanvas.LeftProperty, strokeRect.X);
                ellipse.SetValue(System.Windows.Controls.InkCanvas.TopProperty, strokeRect.Y);
                ellipse.Stroke = Brushes.Black;

                // 作成した円をキャンバスに追加
                inkCanvas1.Children.Add(ellipse);
                break;
            case ApplicationGesture.Square: // 四角形認識時
                // 認識した外枠サイズに合わせて四角形を作成する
                Rectangle rectangle = new Rectangle();
                rectangle.Width = strokeRect.Width;
                rectangle.Height = strokeRect.Height;
                rectangle.SetValue(System.Windows.Controls.InkCanvas.LeftProperty, strokeRect.X);
                rectangle.SetValue(System.Windows.Controls.InkCanvas.TopProperty, strokeRect.Y);
                rectangle.Stroke = Brushes.Black;

                // 作成した四角形をキャンバスに追加
                inkCanvas1.Children.Add(rectangle);
                break;
        }

    }
}
ポイント

 「ユーザーがどの位置にどのような大きさのストロークで描画したか」という情報と認識した図形を元に、きれいな図形を描画することができる。

次のページ
09.キャンバスに描いた文字を認識する

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

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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー