Surface ペン ( Microsoft Store で購入可能)。
このチュートリアルでは、Windows Ink での書き込みと描画をサポートする基本的な Windows アプリを作成する方法について説明します。 サンプル アプリのスニペットを使用します。GitHub からダウンロードして ( サンプル コードを参照)、各手順で説明されているさまざまな機能と関連する Windows Ink API ( Windows Ink プラットフォームのコンポーネントを参照) を示します。
ここでは、次の点に重点を置いて説明します。
- 基本的なインク サポートの追加
- インク ツール バーの追加
- 手書き認識のサポート
- 基本的な形状認識のサポート
- インクの保存と読み込み
これらの機能の実装の詳細については、「 Windows アプリでのペン操作と Windows Ink」を参照してください。
イントロダクション
Windows Ink を使用すると、手書きのメモや注釈からホワイトボードのデモ、建築図面やエンジニアリング図面から個人の傑作まで、想像できるほぼすべてのペンと紙のエクスペリエンスに相当するデジタルを顧客に提供できます。
[前提条件]
- 現在のバージョンの Windows 10 または Windows 11 を実行しているコンピューター (または仮想マシン)
- Visual Studio 2019 および RS2 SDK 以降
- Windows 10 SDK (10.0.15063.0)
- 構成によっては、 Microsoft.NETCore.UniversalWindowsPlatform NuGet パッケージをインストールし、システム設定で 開発者モード を有効にする必要がある場合があります ([設定] -> 更新プログラムとセキュリティ -> 開発者向け -> 開発者向け機能を使用します)。
- Visual Studio を使用した Windows アプリ開発を初めて使用する場合は、このチュートリアルを開始する前に、次のトピックを確認してください。
- [省略可能] デジタル ペンと、そのデジタル ペンからの入力をサポートするディスプレイを備えたコンピューター。
注
Windows Ink では、最適な Windows Ink エクスペリエンスを得るために、マウスとタッチ (このチュートリアルの手順 3 でこれを行う方法を示します) での描画をサポートできますが、デジタル ペンと、そのデジタル ペンからの入力をサポートするディスプレイを備えたコンピューターを使用することをお勧めします。
サンプル コード
このチュートリアルでは、サンプル インク アプリを使用して、説明されている概念と機能を示します。
windows-appsample-get-started-ink サンプルで、
- 緑色の クローンまたはダウンロード ボタンを選択してください
- GitHub アカウントをお持ちの場合は、[Visual Studio で開く] を選択して、リポジトリをローカル コンピューターに複製できます
- GitHub アカウントがない場合、またはプロジェクトのローカル コピーが必要な場合は、[ ZIP のダウンロード ] を選択します (最新の更新プログラムをダウンロードするには、定期的に確認する必要があります)
Von Bedeutung
サンプルのコードのほとんどはコメント アウトされています。各手順を実行すると、コードのさまざまなセクションのコメントを解除するように求められます。 Visual Studio でコード行を強調表示し、CTRL-K キーを押してから Ctrl キーを押しながら U キーを押します。
Windows Ink プラットフォームのコンポーネント
これらのオブジェクトは、Windows アプリの手書き入力エクスペリエンスの大部分を提供します。
コンポーネント | 説明 |
---|---|
InkCanvas | 既定では、ペンからのすべての入力をインク ストロークまたは消去ストロークとして受け取って表示する XAML UI プラットフォーム コントロール。 |
InkPresenter | 分離コード オブジェクトは、InkCanvas コントロールと共にインスタンス化され、InkCanvas.InkPresenter プロパティによって公開されます。 このオブジェクトは、 InkCanvas によって公開されるすべての既定の手描き入力機能と、追加のカスタマイズとパーソナル化のための包括的な API セットを提供します。 |
InkToolbar | 関連付けられた InkCanvas のインク関連機能をアクティブ化する、カスタマイズ可能で拡張可能なボタンのコレクションを含む XAML UI プラットフォーム コントロール。 |
IInkD2DRenderer ここでは、この機能については説明しません。詳細については、 複合インクのサンプルを参照してください。 |
既定の InkCanvas コントロールではなく、ユニバーサル Windows アプリの指定された Direct2D デバイス コンテキストにインク ストロークをレンダリングできるようにします。 |
手順 1: サンプルを実行する
RadialController サンプル アプリをダウンロードしたら、それが実行されていることを確認します。
Visual Studio でサンプル プロジェクトを開きます。
[ソリューション プラットフォーム] ドロップダウンを Arm 以外の選択に設定します。
F5 キーを押してコンパイル、デプロイ、および実行します。
注
または、[デバッグ]>[デバッグの開始] メニュー項目を選択するか、ここに表示されている [ローカル コンピューターの実行] ボタンを選択します。
アプリ ウィンドウが開き、スプラッシュ画面が数秒表示されると、この最初の画面が表示されます。
これで、このチュートリアルの残りの部分で使用する基本的な Windows アプリが作成されました。 次の手順では、インク機能を追加します。
手順 2: InkCanvas を使用して基本的な手描き入力をサポートする
おそらく、アプリが最初の形式ではペンで何も描画できないことに既に気付いたことがあります (ただし、ペンを標準のポインター デバイスとして使用してアプリと対話することはできます)。
この手順では、その小さな欠点を修正しましょう。
基本的な手描き入力機能を追加するには、アプリの適切なページに InkCanvas コントロールを配置するだけです。
サンプルでは、次の手順を実行します。
- MainPage.xaml.cs ファイルを開きます。
- この手順のタイトルでマークされたコードを見つけます ("// 手順 2: InkCanvas を使用して基本的な手描き入力をサポートする")。
- 次の行のコメントを解除せよ。 (これらの参照は、後続の手順で使用する機能に必要です)。
using Windows.UI.Input.Inking;
using Windows.UI.Input.Inking.Analysis;
using Windows.UI.Xaml.Shapes;
using Windows.Storage.Streams;
- MainPage.xaml ファイルを開きます。
- この手順のタイトル「<!-- Step 2: InkCanvas を使用した基本的な描画 -->」でマークされたコードを見つけます。
- 次の行のコメントを解除します。
<InkCanvas x:Name="inkCanvas" />
それです!
次に、アプリをもう一度実行します。 先に進み、落書きしたり、自分の名前を書いたり、(鏡を持っている場合や非常に良い記憶がある場合)、自分の肖像画を描きます。
手順 3: タッチとマウスによる手描き入力をサポートする
既定では、インクはペン入力でのみサポートされていることがわかります。 指、マウス、またはタッチパッドで書いたり描画したりしようとすると、がっかりします。
状況を好転させるには、2行目のコードを追加する必要があります。 今回は、InkCanvas を宣言した XAML ファイルのコードビハインドの中にあります。
この手順では、 InkPresenter オブジェクトについて説明します。 InkCanvas でのインク入力 (標準および変更済み) の入力、処理、レンダリングをきめ細かく管理できます。
注
標準のインク入力 (ペン先または消しゴムの先端/ボタン) は、ペン バレル ボタン、マウスの右ボタン、または同様のメカニズムなど、2 つ目のハードウェア アフォーダンスでは変更されません。
マウスとタッチの手描き入力を有効にするには、InkPresenter の InputDeviceTypes プロパティを、必要な CoreInputDeviceTypes 値の組み合わせに設定します。
サンプルでは、次の手順を実行します。
- MainPage.xaml.cs ファイルを開きます。
- この手順のタイトルでマークされたコードを見つけます ("// 手順 3: タッチとマウスによる手描き入力をサポートする")。
- 次の行のコメントを解除せよ。
inkCanvas.InkPresenter.InputDeviceTypes =
Windows.UI.Core.CoreInputDeviceTypes.Mouse |
Windows.UI.Core.CoreInputDeviceTypes.Touch |
Windows.UI.Core.CoreInputDeviceTypes.Pen;
もう一度アプリを実行すると、あなたの夢である「コンピューター画面に指で絵を描くこと」がすべて現実になっていることがわかりますよ!
注
入力デバイスの種類を指定する場合、このプロパティを設定すると既定の InkCanvas 設定がオーバーライドされるため、特定の入力の種類 (ペンを含む) ごとにサポートを指定する必要があります。
手順 4: インク ツール バーを追加する
InkToolbar は、インク関連の機能をアクティブ化するためのカスタマイズ可能で拡張可能なボタンのコレクションを提供する UWP プラットフォーム コントロールです。
既定では、 InkToolbar には、ペン、鉛筆、蛍光ペン、消しゴムのいずれかをステンシル (ルーラーまたは分度器) と共に使用できるボタンの基本セットが含まれています。 ペン、鉛筆、蛍光ペンの各ボタンには、インクの色とストローク サイズを選択するためのポップアップも用意されています。
既定の InkToolbar を手描 き入力アプリに追加するには、 InkCanvas と同じページに配置し、2 つのコントロールを関連付けます。
サンプル内
- MainPage.xaml ファイルを開きます。
- この手順のタイトルでマークされたコードを見つけます ("<!-- 手順 4: インク ツール バーを追加する -->")。
- 次の行のコメントを解除せよ。
<InkToolbar x:Name="inkToolbar"
VerticalAlignment="Top"
Margin="10,0,10,0"
TargetInkCanvas="{x:Bind inkCanvas}">
</InkToolbar>
注
UI とコードをできるだけ整然としたシンプルな状態に保つために、基本的なグリッド レイアウトを使用し、グリッド行の InkCanvas の後に InkToolbar を宣言します。 InkCanvas の前に宣言すると、最初に InkToolbar がキャンバスの下にレンダリングされ、ユーザーがアクセスできなくなります。
次に、アプリをもう一度実行して InkToolbar を表示し、いくつかのツールを試します。
課題: カスタム ボタンを追加する
カスタム InkToolbar の例を次に示します (Windows Ink ワークスペースの Sketchpad から)。
InkToolbar のカスタマイズの詳細については、「Windows アプリの手描き入力アプリに InkToolbar を追加する」を参照してください。
手順 5: 手書き認識をサポートする
アプリで記述と描画を行えるようになったので、それらの落書きで役に立つ操作を試してみましょう。
この手順では、Windows Ink の手書き認識機能を使用して、記述した内容を解読しようとします。
注
手書き認識は、 ペンと Windows インク の設定を使用して改善できます。
- [スタート] メニューを開き、[ 設定] を選択します。
- [設定] 画面で、[デバイス] >[ペン] と [Windows Ink] の順に選択します。
- [マイ手書きを識別] を選択して、[手書きパーソナライズ] ダイアログを開きます。
サンプルでは、次の手順を実行します。
- MainPage.xaml ファイルを開きます。
- この手順のタイトルでマークされたコードを見つけます ("<!-- 手順 5: 手書き認識をサポートする -->")。
- 次の行のコメントを解除せよ。
<Button x:Name="recognizeText"
Content="Recognize text"
Grid.Row="0" Grid.Column="0"
Margin="10,10,10,10"
Click="recognizeText_ClickAsync"/>
<TextBlock x:Name="recognitionResult"
Text="Recognition results: "
VerticalAlignment="Center"
Grid.Row="0" Grid.Column="1"
Margin="50,0,0,0" />
- MainPage.xaml.cs ファイルを開きます。
- この手順のタイトルでマークされたコードを見つけます (「手順 5: 手書き認識をサポートする」)。
- 次の行のコメントを解除せよ。
- これらは、この手順に必要なグローバル変数です。
InkAnalyzer analyzerText = new InkAnalyzer();
IReadOnlyList<InkStroke> strokesText = null;
InkAnalysisResult resultText = null;
IReadOnlyList<IInkAnalysisNode> words = null;
- これは、認識処理を行う テキスト認識 ボタンのハンドラーです。
private async void recognizeText_ClickAsync(object sender, RoutedEventArgs e)
{
strokesText = inkCanvas.InkPresenter.StrokeContainer.GetStrokes();
// Ensure an ink stroke is present.
if (strokesText.Count > 0)
{
analyzerText.AddDataForStrokes(strokesText);
resultText = await analyzerText.AnalyzeAsync();
if (resultText.Status == InkAnalysisStatus.Updated)
{
words = analyzerText.AnalysisRoot.FindNodes(InkAnalysisNodeKind.InkWord);
foreach (var word in words)
{
InkAnalysisInkWord concreteWord = (InkAnalysisInkWord)word;
foreach (string s in concreteWord.TextAlternates)
{
recognitionResult.Text += s;
}
}
}
analyzerText.ClearDataForAllStrokes();
}
}
- アプリをもう一度実行し、何かを書き込み、[ テキストの認識 ] ボタンをクリックします
- 認識の結果がボタンの横に表示されます
課題 1: 国際的な認識
Windows Ink では、Windows でサポートされている言語の多くでテキスト認識がサポートされています。 各言語パックには、言語パックと共にインストールできる手書き認識エンジンが含まれています。
インストールされている手書き認識エンジンに対してクエリを実行して、特定の言語をターゲットに設定します。
国際的な手書き認識の詳細については、「 Windows Ink ストロークをテキストとして認識する」を参照してください。
課題 2: 動的認識
このチュートリアルでは、認識を開始するためにボタンを押す必要があります。 また、基本的なタイミング関数を使用して動的認識を実行することもできます。
動的認識の詳細については、「 Windows Ink ストロークをテキストとして認識する」を参照してください。
手順 6: 図形を認識する
これで、手書きのノートをもう少し読みやすいものに変換できるようになりました。 でも、朝の「フローチャーターズ匿名」の会合で描かれた、あの震えるカフェイン漬けの落書きについてはどうでしょうか?
インク分析を使用すると、アプリは次のようなコア図形のセットを認識することもできます。
- 円
- ひし形
- 絵
- 楕円
- 正三角形
- 六角形
- 二等辺三角形
- 平行四辺形
- ペンタゴン
- 四辺形
- 長方形
- RightTriangle
- 正方形
- 台形
- 三角形
この手順では、Windows Ink の図形認識機能を使用して、落書きをクリーンアップします。
この例では、インク ストロークの再描画は試行しません (ただし、可能です)。 代わりに、InkCanvas の下に標準のキャンバスを追加し、元のインクから派生した同等の Ellipse オブジェクトまたは Polygon オブジェクトを描画します。 次に、対応するインク ストロークを削除します。
サンプルでは、次の手順を実行します。
- MainPage.xaml ファイルを開く
- この手順のタイトルでマークされたコードを見つけます ("<!-- 手順 6: 図形を認識する -->")
- この行のコメントを解除します。
<Canvas x:Name="canvas" />
And these lines.
<Button Grid.Row="1" x:Name="recognizeShape" Click="recognizeShape_ClickAsync"
Content="Recognize shape"
Margin="10,10,10,10" />
- MainPage.xaml.cs ファイルを開く
- この手順のタイトルでマークされたコードを見つけます ("// 手順 6: 図形を認識する")
- この行のコメントを解除してください。
private async void recognizeShape_ClickAsync(object sender, RoutedEventArgs e)
{
...
}
private void DrawEllipse(InkAnalysisInkDrawing shape)
{
...
}
private void DrawPolygon(InkAnalysisInkDrawing shape)
{
...
}
- アプリを起動し、いくつかの図形を描画し、[図形の認識] ボタンをクリックする
デジタル ナプキンの基本的なフローチャートの例を次に示します。
図形認識後の同じフローチャートを次に示します。
手順 7: インクを保存して読み込む
だから、あなたは落書きが終わったし、あなたが見るものが好きですが、あなたは後でいくつかのことを微調整したいかもしれないと思いますか? インク ストロークを Ink Serialized Format (ISF) ファイルに保存し、インスピレーションが当たるたびに編集用に読み込むことができます。
ISF ファイルは、インク ストロークのプロパティと動作を記述する追加のメタデータを含む基本的な GIF イメージです。 インクが有効になっていないアプリは、追加のメタデータを無視して、基本的な GIF イメージ (アルファ チャネルの背景の透明度を含む) を読み込むことができます。
注
インク シリアル化形式 (ISF) 仕様は、 Microsoft ダウンロード センターからダウンロードできます。
この手順では、インク ツール バーの横にある [
サンプルでは、次の手順を実行します。
- MainPage.xaml ファイルを開きます。
- この手順のタイトルでマークされたコードを見つけます ("<!-- 手順 7: インクの保存と読み込み -->")。
- 次の行のコメントを解除せよ。
<Button x:Name="buttonSave"
Content="Save"
Click="buttonSave_ClickAsync"
Width="100"
Margin="5,0,0,0"/>
<Button x:Name="buttonLoad"
Content="Load"
Click="buttonLoad_ClickAsync"
Width="100"
Margin="5,0,0,0"/>
- MainPage.xaml.cs ファイルを開きます。
- この手順のタイトルでマークされたコードを見つけます ("// 手順 7: インクを保存して読み込む")。
- 次の行のコメントを解除せよ。
private async void buttonSave_ClickAsync(object sender, RoutedEventArgs e)
{
...
}
private async void buttonLoad_ClickAsync(object sender, RoutedEventArgs e)
{
...
}
- アプリを実行し、何かを描画します。
- [保存] ボタンを選択し、図面を保存します。
- インクを消去するか、アプリを再起動します。
- [ 読み込み ] ボタンを選択し、保存したインク ファイルを開きます。
課題: クリップボードを使用してインク ストロークをコピーして貼り付ける
Windows インクでは、クリップボードとの間でインク ストロークのコピーと貼り付けもサポートされています。
インクでクリップボードを使用する方法の詳細については、「 Windows Ink ストローク データの格納と取得」を参照してください。
概要
おめでとうございます!入力: Windows アプリでインクをサポートするチュートリアル が完了しました。 Windows アプリでインクをサポートするために必要な基本的なコードと、Windows Ink プラットフォームでサポートされる豊富なユーザー エクスペリエンスの一部を提供する方法について説明しました。
関連資料
サンプル
Windows developer