Microsoft
March 2004
適用対象 :
Windows® Mobile™ 2003 Second Edition software
Windows Mobile ペースの Pocket PC
要約 : この記事では、Windows Mobile ベースのデバイスが縦画面および横画面モードの両方で表示を行う方法、この機能の背景、この機能を持つモバイル アプリケーションを開発するための情報、そして初級開発者のためのアドバイスや例を交えたガイドラインを示します。サンプル プログラム ファイル内では実際のコメント行は英語で書かれていますが、この記事内では説明目的で日本語で書かれています。
Microsoft ダウンロード センターから、Crossword.msi をダウンロードしてください。
目次
はじめに
画面の向きを変更する
アプリケーションのウィンドウが画面の向きを認識する方法
コンテンツを再描画する
RelayoutDialog
レガシ アプリケーションの動作
インストールの警告メッセージ
まとめ
はじめに
Windows Mobile 2003 Second Edition software for Pocket PC では、Windows Mobile ベースのデバイスに縦画面および横画面の両方のモードで表示できる機能が導入されています。デバイスによっては、横画面モードが既定の表示モードになって いる場合もあります。さらに、ユーザーがデバイスをリセットする必要がなく、その場で画面の向きを回転させて変更できる場合もあります。
ここでは、この新機能についての背景情報と縦横両モードで画面表示できるモバイル アプリケーションの開発に必要な情報を説明し、初級開発者が理解し、従う必要のあるガイドラインをアドバイスおよび例と共に提示します。
画面の向きを変更する
通常、画面の向きは、ユーザーがコントロール パネルで画面の向きを調整するか、画面回転用のハードウェア ボタンを押した場合にのみ変更できます。
また、MSDN の「Rotating the Content of the Screen」(英語) で説明しているように、ChangeDisplaySettingsEx 関数を使用してプログラム上で画面の向きを変更することもできます。アプリケーションが縦画面モードでしか動作しない場合などに、これを行うことができま す。ただし、画面の向きが突然変わることによって、ユーザーに混乱やイライラをもたらす場合があるので注意してください。画面が回転する前に、確認を促す メッセージが表示されます。
縦画面モードで表示するには、DEVMODE 構造体の dmDisplayOrientation フィールドを DMDO_0 に設定します。右回りに回転する横画面モードの場合は DMDO_270 を、左回りに回転する横画面モードの場合は DMDO_90 を使用します。
アプリケーションのウィンドウが画面の向きを認識する方法
画面の向きを変更するまたは入力パネルが表示されると、全画面表示および最上位のアプリケーション ウィンドウはすべて、新しい画面の向きに合わせてサイズ調整されます。
注 : ウィンドウでは、上、左、右の座標が作業領域の境界線の上または外にある場合に、全画面表示と見なされます。作業領域とはタイトル バーの下の画面全体を指します。最上位ウィンドウとは親ウィンドウを持たない、すなわち親が "NULL" であるウィンドウを指します。
ウィンドウのサイズが変更されると、アプリケーションが WM_SIZE 通知を受け取ります。WM_SIZE メッセージの lParam パラメータの下位の語がクライアント領域の新しい幅を指定し、上位の語が新しい高さを指定します。ウィンドウのサイズが変更されると、アプリケーションが それを認識し、変更に応じてレイアウトを更新します。さらに、そのウィンドウに含まれる子ウィンドウも再レイアウトします。
アプリケーションに全画面表示ウィンドウがない場合は、WM_SIZE 通知を受け取りません。代わりに、wParam パラメータを SETTINGCHANGE_RESET に設定した WM_SETTINGCHANGE メッセージを受け取ります。
注 : アプリケーションが最上位ウィンドウを持つ場合、または SHHandleWMSettingChange、SHInitDialog、SHFullScreen メソッドを使用するウィンドウを作成する場合は、WM_SIZE と WM_SETTINGCHANGE の両方のメッセージを受け取ります。ただし、アプリケーションが子ウィンドウを作成する場合、その子ウィンドウが全画面表示の場合でも WM_SIZE メッセージを受け取りません。
次のサンプル コードは、WM_SIZE と WM_SETTINGCHANGE の両方のメッセージを使用する WindowProc テンプレートです。
switch (uMessage)
{
case WM_SIZE:
// 子ウィンドウのレイアウトを再計算します。
// リスト ビューおよび編集ボックスのサイズを変更します。
// ボタン、スタティック、およびその他のコントロールを再配置します。
break;
case WM_SETTINGCHANGE:
if (SETTINGCHANGE_RESET == wParam) {
// 画面の向きが変更されました。ここでは、
// WM_SIZE で実行できない処理、
// たとえば全画面表示の子ウィンドウのサイズ変更、
// 最上位ウィンドウの MoveWindow の呼び出しなどを行います。
// WM_SETTINGCHANGE メッセージを処理する必要がない場合、
// 無視することができます。
}
break;
}
コンテンツを再描画する
Windows Mobile 2003 Second Edition software for Pocket PC の最小表示解像度は、高さと幅がそれぞれ 240 ピクセルです。プログラマは、この最小構成でアプリケーションが使用できることを確認する必要があります。一般的に問題となるのは、縦画面モードでは画面 に合っても、横画面モードでは合わないメニューがあるということです。その場合、メニュー間のアイテムの再配置が必要になる場合があります。
アプリケーションのコンテンツを再描画する場合は、次の 4 つのプログラミング方法から選択できます。
コンテンツをウィンドウのサイズに合わせる
コンテンツを変更する
レイアウトを変更する
すべてのレイアウトを 240x240 の可視ピクセルに合わせてデザインする
表 1 は、Windows Mobile software for Pocket PC アプリケーションでコンテンツの再描画を行うためのそれぞれのアプローチを例で示したものです (コンテンツをウィンドウのサイズに合わせる方法例は 2 つ示します)。
表 1. 縦画面表示および横画面表示の再描画オプション
再描画オプション |
縦 |
横 |
コンテンツをウィンドウのサイズに合わせる場合 [Calendar](予定表) は作業領域に合わせてグリッド セルのサイズが変更されます。 |
|
|
コンテンツをウィンドウのサイズに合わせる場合 [Memory](メモリ) 設定コントロール パネルでリスト ボックスが最大サイズに変更され、次に周りのその他すべての UI 要素が再配置されます。 |
|
|
コンテンツを変更する場合 横画面モードの [Calendar](予定表) は、一度に 8 か月分表示されます。 |
|
|
レイアウトを変更する場合 Windows Media Player の操作ボタンが、横画面モードではビデオ クリップの下ではなく横に表示されます。 |
|
|
240x240 の可視ピクセルに合わせてデザインする場合 予定表の [Options](オプション) ダイアログはコンテンツ全体を縦横両方の画面モードで 240x240 四方の可視ピクセルに合わせて調整されます。 |
|
|
アプリケーションが任意のサイズと縦横比の表示に対応できるように、レイアウトをできるだけ一般的なものにしておいてください。こうすることで、縦 横の画面モードで極力異なる表示を行わずに済みます。縦画面モードと横画面モードで表示が異なるのを避けられない場合は、画面の幅が高さより大きいという だけの理由でアプリケーションを横画面モードで表示すべきだと考えないでください。たとえば、画面の幅が 321 ピクセルで高さが 320 ピクセルのデバイスがあるとします。このようなデバイスでは、縦横両方の画面モードでのアプリケーションの表示が可能であると考えられ、アプリケーション は最良のまたは好ましいレイアウトを選択しますが、それは縦画面モードであるかもしれません。
RelayoutDialog
CrosswordSample アプリケーションには、ダイアログの子コントロールのサイズ変更および再配置の必要性を取り除く RelayoutDialog というヘルパー関数があります。たとえば、ダイアログに横画面表示用と縦画面表示用の 2 つのダイアログ テンプレートがあるとします。これらのテンプレートが同じコントロールと同じコントロール ID を保持している場合は、次のコードを WM_SIZE ハンドラとして使用できます。
case WM_SIZE:
RelayoutDialog(g_hInst, hDlg, InWideMode() ?
MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1_WIDE) :
MAKEINTRESOURCE(IDD_TOOLS_OPTIONS_1));
注 : IDC_STATIC として定義されるコントロールはすべて同じコントロール ID を保持しています。したがって、IDC_STATIC が 1 つ以上ある場合は、IDC_STATIC_1、IDC_STATIC_2 などのようにそれぞれ異なる名前に変更する必要があります。
RelayoutDialog はまた、新しいレイアウトでスタティック コントロールのテキストやビットマップが変更された場合に更新することもできます。
レガシ アプリケーションの動作
ユーザーが Windows Mobile 2003 Second Edition ベースの Pocket PC でレガシ アプリケーションを実行する場合、ユーザーの使用感は縦画面モードにおいては同じですが、横画面モードではやや異なります。横画面モードでは、ダイアログ ボックスの下部が画面の下からはみ出すことがあります。この問題に対応するため、垂直スクロール バーが表示され、ユーザーが画面からはみ出した部分をスクロール表示させることができるようになっています。この垂直スクロール バーは、縦画面で下部に通常表示されるコントロールがある場合にのみ表示されます。縦画面モードで表示されないコントロールに対しては、表示されません。
アプリケーションが "レガシ" であるかどうかは、実行ファイルのヘッダーのサブシステム バージョン情報によって判断されます。既定では、Windows Mobile 2003 SDK およびそれ以前でコンパイルされたアプリケーションは、4.20 以下のバージョンに設定され、Pocket PC SDK の将来のリリースでは、4.21 以上となります。サブシステム バージョンが 4.20 以下のアプリケーションはレガシ アプリケーションと見なされ、スクロール バーが表示されます。
この動作によって、隠れていたイメージ (アクセス不可能と考えられていたイメージおよびコントロール) をユーザーがスクロールして表示できるようになるということに注意してください。イメージをすばやく保存、取得するためにこのテクニックを依然として使用 できますが、画面の下部ではなく左側で行う方が良いでしょう。
できれば、ダイアログ ボックスにはスクロール バーが必要でないという状況が望ましいでしょう。これを実現する最良の方法は、コントロールが縦画面モードで表示されたときに入力パネルに覆われないよう にデザインすること、そしてそのために 240x240 の最小解像度を使用することです。
インストールの警告メッセージ
画面を回転させることのできる Windows Mobile ベースの Pocket PC にレガシ アプリケーションをインストールすると、図 11 に示すような警告メッセージが表示されます。
.gif)
図 11. インストール警告メッセージ
このダイアログは、ユーザーが使用しようとしているアプリケーションが正方形画面または画面回転を認識しない可能性があり、横画面モードで正しく表 示されない場合があることをユーザーに通知するためのものです。アプリケーションでサポートされている最低 OS リビジョン番号を指定する VersionMin の値が 4.20 以下の場合にこのダイアログが表示されます。
VersionMin を 4.21 に設定すると、旧バージョンの Windows Mobile ベースの Pocket PC にアプリケーションがインストールされるのを防ぐことができるため、BuildMax の値 (通常は不使用) を表 2 に示す値に設定してこの警告メッセージが表示されないようにすることをお勧めします。
表 2. BuildMax 値
0xA0000000 |
アプリケーションは正方形画面 (240x240 ピクセル) をサポートします。 |
0xC0000000 |
アプリケーションは画面回転をサポートします。 |
0xE0000000 |
アプリケーションは正方形画面および画面回転をサポートします。 |
これらのパラメータは、cabwiz が CAB ファイル生成のために使用する INF ファイルの [CEDevice] セクションを編集することによって変更できます。INF ファイル形式の詳細については、MSDN のドキュメントを参照してください。
まとめ
Windows Mobile 2003 Second Edition software for Pocket PC のアプリケーションの開発では、画面回転に関する思い込みを取り除く必要があります。このドキュメントで示した簡単なガイドラインを使用することにより、 縦、横、正方形画面を持つデバイスにインストールして実行可能なアプリケーションを開発できます。
.gif)
.gif)
.gif)
.gif)
.gif)
.gif)
.gif)
.gif)
.gif)
.gif)