Windows Phoneアプリケーション開発入門

第3回Windows phoneでテキストエディタを作ろう!(1)

はじめに

前回は、Windows Mobile 6 SDKやWindows Mobile 6.5 DTKをインストールして開発環境を整えました。今回は「簡易テキストエディタ」を作りながら、.NET Compact FrameworkとVisual C#を使ったアプリケーション開発について一通り追いかけていきましょう。

作成したサンプルアプリケーションは、以下のリンクよりダウンロードが可能です。難しい処理は行っていませんので、実際に動かしながら本記事を読んでいただいたほうが理解が早いかもしれません。

テキストエディタの仕様

以下の8機能を実装します。テキストエディタとしては非常に非力なものですが、⁠簡易」テキストエディタということでご了承ください。

  • 直前の動作を取り消す「やり直し」
  • 選択中の文章をクリップボードに保持する「コピー」
  • 選択中の文章を切り取ってクリップボードに保持する「切り取り」
  • クリップボードからの「貼り付け」
  • 以前書いた文章を再度編集する「開く」
  • 現在書いている文章の「保存」
  • 指定した文字列までカーソルを移動させる「検索」
  • 指定した文字列を別の文字列に置き換える「置換」

今回はこのうち「やり直し」「コピー」の2機能を実装します。

ユーザーインターフェース

.NET Compact Frameworkを使ったアプリケーションは、デバイスの画面に対してコントロールと呼ばれるパーツを配置するのがとてもスピーディーにできます。

今回はテキストエディタなので、文章の入力が可能なTextBoxコントロールを配置して、メニューには先ほど挙げた仕様を満たすために、左ソフトキーメニューに項目を追加しただけのシンプルなUIです。

簡易テキストエディタのユーザーインターフェース
簡易テキストエディタのユーザーインターフェース

上図が今回作成するアプリケーションの最終形です。

新しいプロジェクトの作成

Visual Studioでは、ウィザードを使ってスケルトン(フォームだけのプロジェクト)を簡単に作ることができます。Visual Studioを起動させたあと、ツールバーから[ファイル⁠⁠→⁠新規作成⁠⁠→⁠プロジェクト]を選択します。

新しいプロジェクトの作成
新しいプロジェクトの作成

いくつか作成可能なプロジェクトの種類が表示されているのが判ります。この中から[スマートデバイス]を選びます。右側のテンプレートは[Smart Device プロジェクト]を選択してください。プロジェクトの名前は便宜上「TextEditor」とします。

新規スマート デバイス プロジェクトの追加
新規スマート デバイス プロジェクトの追加

Smart Device プロジェクトのウィザードでは、これから説明するデバイス アプリケーションのほかにも3種類のプロジェクトを作成することができます。

  • コンソール アプリケーション
  • クラス ライブラリ
  • コントロール ライブラリ

コンソール アプリケーションは、標準設定ではコンソール画面が表示されませんので、Windows phoneで動かす機会はあまりないと思います。ユーザーの目に触れずに動かしたい、といったバッチ的な処理に向いています。

クラス ライブラリとコントロール ライブラリは名前の通りで、複数のクラスやコントロールは1つのDLLファイルにまとめることができます。アプリケーションとは別にクラスやコントロールを持たせることで、ほかのアプリケーションから利用可能になりますので、プログラムの再利用性を高めることができます。

私たちは実際にユーザーが操作可能なものを作成したいので、テンプレートからデバイス アプリケーションを選択しましょう。

今回のターゲットプラットフォームはWindows Mobile 6.5が搭載されたWindows phoneで動作させるのが目的ですが、選択肢にはWindows Mobile 6.5は出ていません。バージョン6.5は6.0のマイナーバージョンアップですので、ここでは以下の通り指定してください。

ターゲットプラットフォームWindows Mobile 6 Professional SDK
.NET Compact Framework バージョン.NET Compact Framework Version 3.5|
テンプレートデバイス アプリケーション

ターゲットプラットフォームを選択すると、Windows phoneのスキンに真っ白な画面(フォーム)が表示されています。アプリケーションの開発はこのフォームにコントロールを配置し、イベントに処理を関連付けて進めていきます。これでウィザードによるスケルトンの作成は完了です。

ウィザードで出来上がったスケルトン
ウィザードで出来上がったスケルトン

フォームデザイナを使用した開発

デフォルト設定だと左側に表示されているツールボックスから、下図の通りTextBox、OpenFileDialog、SaveFileDialogコントロールを配置します。初期状態では、左ソフトキー領域に何も表示されていませんが、クリックすると文字が入力できるようになります。同じ要領でソフトキーのメニューアイテムを追加していきます。次に説明するプロパティ ウィンドウで、各コントロールの名前を下図のオレンジ色で書いた名前に変更しましょう。

フォームデザイナを使ったコントロールの配置
フォームデザイナを使ったコントロールの配置

コントロールのプロパティを操作する

配置したTextBoxコントロールをフォームデザイナ上で右クリックし、⁠プロパティ]を選択するとコントロールのプロパティ ウィンドウが表示されます。

TextBoxコントロールのプロパティ
TextBoxコントロールのプロパティ

プロパティ ウィンドウが表示できたら、下記の通り設定していきます。

(Name)textEdit
DockFill
MultilineTrue
TabIndex0
ScrollBarsVertical

Nameプロパティにコントロールの名前を設定すると、その名前でプログラムからオブジェクトを使うことができます。例えば以下のようなコードを書くと、コントロールに関連付けたテキストを取得し、メッセージボックスに表示します。

string msg = textEdit.Text;
MessageBox.Show(msg);

Dockプロパティは、親コントロール(配置したフォーム)に合わせて自動的にサイズ変更させる目的で使用します。ここではフォームいっぱいにドッキングさせたいので DockStyle.Fill を指定しています。

コントロールのイベントに処理を関連付ける

menuUndoというコントロールに対して、クリックというイベントが発生したら、実行するmenuUndo_Clickメソッドという処理を関連付けします。言葉で書くと長くなってしまうのですが、操作してみると直感的に理解できると思います。

プロパティ ウィンドウを見ているとカミナリマークがあります。これを押すとコントロールのイベントの一覧が表示されます。

イベント ハンドラの関連付け
イベント ハンドラの関連付け

MenuItemコントロールの場合、ClickイベントとPopupイベントが表示されていると思います。コントロールによって用意されているイベントが異なります。Clickの箇所でダブルクリックすると、下記のような「コントロール名_イベント名」のメソッドが自動生成されます。

private void menuUndo_Click(object sender, EventArgs e)
{
}

後は、menuUndoがクリックされた時に実行したい処理をスコープ内に書くだけです。

機能を実装してみよう!

前置きが長くなってしまいましたが、早速機能を実装していきましょう。

「やり直す」の実装

TextBoxのUndoメソッドでひとつ前の状態に戻すことができます。CanUndoプロパティでアンドゥ(元に戻す)が可能かどうかを判定し、元に戻せるのであればアンドゥを実行します。

    private void menuUndo_Click(object sender, EventArgs e)
    {
        // アンドゥ(元に戻す)が可能か
        if (textEdit.CanUndo)
        {
            // 元に戻せるのであれば戻す
            textEdit.Undo();
        }
    }

「コピー」の実装

デスクトップ版.NET Frameworkに実装されているTextBoxコントロールは、Cut/Copy/Paste メソッドがUndoメソッドと同様に用意されており、文字列を選択した状態でCopyメソッドを使えば、文章がクリップボードに保持されます。しかし、.NET Compact Frameworkでは、TextBoxコントロールにCut/Copy/Pasteメソッド等が実装されていません。そのためそれぞれを独自に実装する必要があります。

独自に実装といってもそんなに難しいことはありません。Windows Mobile OSは、クリップボードという共有メモリ領域を持っています。名前の通りデータをコピーしたり貼り付けたりできます。

クリップボードにコピーした(保持した)データは共有メモリ上に格納されますので、このテキストエディタで書いた内容をほかのアプリに貼り付けて使うことも可能です。アプリケーション間でのデータの受け渡しによく使われる方法です。

コピーの実装には、このClipboardクラスを使用します。Clipboardクラスはクリップボードのコピーしたり貼り付けたりをクラス化したものです。以下のコードは、文章を1文字でも選択していればクリップボードに設定しています。

private void menuCopy_Click(object sender, EventArgs e)
 {
   if (textEdit.SelectedText != "")
   {
     // 選択している文字列をクリップボードに格納
     Clipboard.SetDataObject((object)textEdit.SelectedText);
   }
 }

このテキストエディタでは使用しませんが、もしクリップボードに貼り付けたデータをClipboardクラスを使って利用する場合は、以下のように書くことができます。

// クリップボードが保持しているデータ形式が
// テキスト型以外であれば、以降の処理を行わない
IDataObject iData = Clipboard.GetDataObject();
if (!iData.GetDataPresent(DataFormats.Text))
{
  return;
}

// クリップボードからデータを取得する
string textData = (string)iData.GetData(DataFormats.Text);

まとめ

今回はウィザードを使って簡易テキストエディタの作成を行いました。⁠コピー」機能では、.NET Compact FrameworkのClipboardクラスを利用して実装を行いました。

デスクトップ版の.NET Frameworkでは元々実装されているメソッドやプロパティが無いので、別の手段で補いながらアプリケーション開発を進めていくのが、.NET Compact Frameworkの醍醐味です。

次回も引き続きテキストエディタの実装を進めていきましょう。

以上で今回は終わりです。ありがとうございました。

おすすめ記事

記事・ニュース一覧