プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

W-ZERO3: アプリ開発のTipsとか(2)


先日に引き続き、W-ZERO3用のアプリを書いていて気がついたことをメモしてみました。今後アプリを作られる方の参考になれば幸いです。

UIデザイン


やってみれば分かるが、トップレベルのメニューは2つまでしか表示されないことを考慮してデザインする必要あり。


(1/20 追記)
メニューは2つ以上でも大丈夫でした。単に左右ボタンで選択できないだけです。
ご指摘いただき、ありがとうございました。
(/追記)


W-ZERO3は縦横がダイナミックに切り替わるので、ダイアログはどちらの画面でも正しく表示されるようにレイアウトしよう。エミュレータと実機両方で試してみた方がよい。

エディットコントロール


最初にW-ZERO3を使ったとき、なぜメモ帳が付いてないんだろうと思ったが、自分でエディットコントロールを使うアプリを書いて見て、その理由が分かった。Windows Mobileのエディットコントロールはこんな問題があるようだ。だから標準でメモ帳が付いてないんだな。


そんなわけで、エディットコントロールを利用した拙作TinyPadは、ちょっとしたメモ用途にしか使えない。本格的な編集作業を行う場合はWord Mobileや他のエディタを使おう(笑)

文字コードは全てUnicode


WindowsのWin32APIは、たいてい文字コードとしてANSIUnicodeが選べるようになっている。しかしWindows MobileUnicode版しか用意されていない。ANSIのファイルを扱う場合はUnicodeとの相互変換が必要だ。

GetOpenFileNameは、My Documentsしか開けない?


ファイル名を取得するGetOpenFileName。これ、内蔵メモリのMy Documents配下のファイルしか、開けなくないですか?内蔵メモリはともかく、MiniSD配下のファイルは、セーブ時(GetSaveFileName)しか選べないっぽい。なので、MiniSDのファイルを開くには、ファイルの関連づけしかない?


このあたり、Common Dialogを使わず、自前で作るしかないのかなあ。どなたか知っている方がいましたら、教えていただけると嬉しいです。


(1/30/2006 追記)


ウソでした。miniSD上のファイルも普通に開けます。アイコンにMiniSDのマークが付くので、内臓メモリと同じファイル名があっても、判別可能です。

ChooseFontがない


同じくCommon Dialogで使用頻度が高いと思われるフォント選択ダイアログChooseFont()。eVC++を見た感じ、見当たらない。


もっとも、これはAPIが存在しないわけではなく、ヘッダに定義されてないだけなので、以下の方法で呼び出すことができる。

  1. ChooseFont()に必要な構造体や定数を、自前で定義
  2. LoadLibrary()で、Commdlg.dllをロード
  3. 上記モジュールに対してGetProcAddress()を使い、ChooseFontWのアドレスを取得
  4. 各種パラメータを設定し、上記アドレスをコール


これでChooseFont()は使えるが、残念ながらW-ZERO3では問題がある。縦画面モードでは問題ないが、横画面モードでは画面からダイアログがはみ出るばかりか、OKボタンが押せなくなり、アプリの強制終了しか手段がなくなってしまう。


というわけで、現状では自前でフォント選択ダイアログを作るしかないようだ。


こちらも、もし何かよい方法があれば、教えていただけると嬉しいです(こればっか)

VGAモード


eVC++で普通にプログラムを作ると、解像度がQVGA(240x320)のアプリになる。せっかくVGA(480x640)のLCDを持つW-ZERO3なのだから、アプリもVGA対応にしたいものだ。


eVC++でアプリをVGA対応にするには、以下の2ステップが必要。


参考URL: Developing DPI-Aware Applications (英文)

Subsystemバージョンを4.21以上に


Windows Mobileは、リンク時に設定するSubsystemのバージョン番号が4.20より大きいと、VGA対応アプリと認識するとのこと。Subsystemバージョンを変更するには以下のようにする。

  • メニューのプロジェクト->設定を選び、リンクタブを開く
  • プロジェクトオプションの後ろの方に以下のような設定がある
/subsystem:$(CESubsystem)

これを以下のように変更

/subsystem:windowsce,4.21


エミュレータの設定の方を変更してしまうと、Pocket PC 2003 Second Edition用のエミュレータでしか実行できなくなってしまうので、ARMV4の設定のみを変更するのがいいだろう。

リソースにHI_RES_AWAREを追加
  • ワークスペースのResouceタブを開き、<プロジェクト名 リソース>とある部分を右クリックして挿入を選ぶ
  • Customボタンを押し、CEUXと入力してOK
  • ダイアログが開くので、01 00と入力
  • 新しく作成されたリソース(例:IDR_CEUX1)の上で右クリックして、プロパティを選択
  • ID部分に"HI_RES_AWARE"(ダブルクォートも入れる)を入力し、外部ファイルのチェックボックスをオフにし、プロパティを閉じる
VGA化されているか確認


以上の設定を行ってからbuildを実行すれば、アプリがVGAで表示されるはずだ。


アプリがVGA対応したかどうかはビットマップ等を表示してみればよいが、もっと簡単に見分ける方法は、メニューを見ること。VGA対応していれば、メニューのフォントがQVGAの時より細かく表示されているはず。英数を使うと分かりやすい。


一応拙作TinyPadはVGA化してあるのですが、メニューぐらいしか効果がない感じです(笑)

感想とか


Windows Mobileにおけるプログラミングは、WindowsとAPIの親和性は高いものの、作るには多少の慣れが必要です。リソース制約、解像度、アプリの振る舞い、などの違いから、Windowsと全く同じというわけにはいきません。


とは言うものの、それは非常に難解というわけではありません。Windowsプログラマなら(作る物にもよりますが)それほど困難ではないでしょう。むしろ組み込みでC/C++以外にもJavaや.NETなど選択肢が多いのは、組み込みの開発環境としては、けっこう恵まれていると思います。


何より、この小さなコンピュータで自分のプログラムが動くというのは、なかなか快感です。Hello, Worldが出た時はかなり嬉しかった。組み込み開発の楽しさをお手軽に楽しめるという点では、お勧めのハードです。さらにスタンドアロンだけでなく、通信アプリだって作ることができるので、応用範囲も広い。


この記事や他のサイトなどを見て、一人でも多くのW-ZERO3プログラマが増えてくれることを願っています。


あなたも一緒に作ってみませんか!?:)