Win32APIについて理解を深めながら、Windowsの仕組みを学びます。Mobile特有の問題や機能についてもサンプルを交えながら検証、解説します。wifictrl、ようやく安定版リリース(08/13)wifictrl(06/29)MortScriptをT-01Aにインストールする(06/24)次のページ021:子ウィンドウを作る親ウィンドウの中に子ウィンドウを作成してみましょう。親ウィンドウと同じサイズの子ウィンドウを2つ作成して、表示、非表示を切り替える事で、アプリケーション内での画面遷移を実現してみましょう。子ウィンドウの作成は、親ウィンドウと同じくCreateWindow関数を使用します。ウィンドウ作成データ);子ウィンドウを作成するには、親ウィンドウのWM_CREATE時に、CreateWindow関数でウィンドウを生成します。第3引数のdwStyleには、WS_CHILDスタイルを与えます。このとき第8引数のhWndParentに親ウィンドウのハンドルを指定します。今までは親ウィンドウの生成でしたので、NULLにしていましたね。GetWindowRect関数で親ウィンドウのサイズを取得して子ウィンドウにも同じサイズを指定します。ウィンドウの座標値);GetWindowRect関数はウィンドウのハンドルで指定したウィンドウのサイズを、RECT構造体に格納します。この関数より取得したサイズで、子ウィンドウを作成すれば、親ウィンドウと同じサイズの子ウィンドウができます。親ウィンドウのウィンドウプロシージャWndProc内では、ウィンドウの初期化時にWM_CREATEメッセージが送られてきます。ここで子ウィンドウA、子ウィンドウBを生成しています。親ウィンドウの「OPEN_A」,「OPEN_B」ボタンを押すとそれぞれ子ウィンドウA、子ウィンドウBを表示します。子ウィンドウに配置した「CLOSE」ボタンを押すと、親ウィンドウへ戻ります。これは子ウィンドウを非表示にすることで実現しています。親ウィンドウプロシージャ内の記述としては「OPEN_A」が押されたら子ウィンドウAを表示状態にする。「OPEN_B」が押されたら子ウィンドウBを表示状態にする。子ウィンドウプロシージャ内の記述としては「CLOSE」が押されたら、自ウィンドウを非表示にする。(親ウィンドウが表示される)。すれば実現できますが、今回は、画面遷移の処理をすべて親ウィンドウに集めてみましょう。親ウィンドウプロシージャ内の記述としては「OPEN_A」が押されたら子ウィンドウAを表示状態にする。「OPEN_B」が押されたら子ウィンドウBを表示状態にする。「CLOSE」が押されたら、子ウィンドウAが表示状態なら、子ウィンドウAを非表示にする。子ウィンドウBが表示状態なら、子ウィンドウBを非表示にする。子ウィンドウプロシージャ内の記述としては「CLOSE」ボタンが押されたら、親ウィンドウに対してメッセージを送る。することで、画面遷移の処理を親ウィンドウに集めることができそうです。親ウィンドウのハンドル。描画処理を開始します。描画処理を終了します。描画処理を開始します。親ウィンドウへメッセージ伝播。0;}親ウィンドウにメッセージを送るには、SendMessage関数を使います。子ウィンドウのウィンドウプロシージャChildWindowProcにWM_COMMANDメッセージが通知されます。親ウィンドウへメッセージ伝播SendMessage(GetParent(hWnd),msg,wp,lp);としているだけです。送信先ウィンドウハンドルには、親ウィンドウを指定します。Msg,wParam,lParamには、子ウィンドウのウィンドウプロシージャが受け取った値をそのままセットします。これにより、親ウィンドウで一括してボタン押下時の処理を任せることができます。親ウィンドウのウィンドウプロシージャでは、子ウィンドウAが表示されていれば、子ウィンドウAを非表示、子ウィンドウBが表示されていれば、子ウィンドウBを非表示にします。これにより、子ウィンドウの管理を親ウィンドウに任せることができるようになりました。コメント:3020:WindowsMobileらしい全画面ダイアログを作る通常のパソコンで行うような、たくさんのダイアログを切り替えて作業する、といった事は小さな携帯画面では操作もしずらく、あまり現実的ではありません。WindowsMobileアプリケーションでは、ウインドウであれダイアログであれ、全画面表示にするのが一般的です。その方が使い勝手もよく、他のソフトウェアともインターフェースを統一できるのでお勧めです。Standardでは、主にナビゲーションバーにOKボタンを表示したフルスクリーンダイアログボックスが使用されます。完了ボタンは視覚的にフルスクリーンのダイアログボックスで隠されてOKボタンに置き換わるため、「ダイアログのOKボタンである」ということが理解しやすいからです。ダイアログのボタンを完了ボタン([×]ボタン)にしていると、親画面の完了ボタン([×]ボタン)なのか、ダイアログの完了ボタンなのか区別がつかず、ユーザの誤動作を招くことになります。ダイアログも全画面表示にしてみましょう。前回のダイアログ「SampleDialog002」を全画面ダイアログになるように変更します。全画面ダイアログを表示するには、WM_INITDIALOG:でSHInitDialog()を使用します。SH~()関数と頭にSHのつく関数は、WindowsMobile特有の関数で主にUIの部分に関連する関数です。このSHInitDialog()関数はSHINITDLGINFO構造体にパラーメータを指定することで、ダイアログボックスのサイズをSIPに合わせて変更します。SHInitDialog()関数を使用するにはaygshell.hをインクルードします。■SHInitDialog()ダイアログの状態を指定するSHINITDLGINFO構造体に値をセットしてSHInitDialog()関数に渡します。*PSHINITDLGINFO;dwMaskSHINITDLGINFO構造でどのメンバーが有効であるかを示すビットフィールドで、SHIDIM_FLAGSを指定します。hDlgダイアログへのハンドルです。dwFlagsダイアログの動作を決定するフラグです。SHIDIM_FLAGSフラグが設定されてなければ無視されます。SHIDIF_DONEBUTTONナビゲーションバーにOKボタンを表示します。SHIDIF_EMPTYMENU下部に空のメニューを作成します。SHIDIF_FULLSCREENNOMENUBARダイアログボックスを入力パネルの位置に関係なく、フルスクリーン表示に設定します。SHIDIF_SIPDOWNダイアログ初期化時に入力パネルが開いていたら閉じます。SHIDIF_SIZEDLGダイアログボックスはSIPの邪魔にならないサイズで最大化されます。SHIDIF_SIZEDLGFULLSCREENダイアログボックスを入力パネルの位置に関係なく、フルスクリーン表示に設定します。SHIDIF_CANCELBUTTON[×]ボタン表示しダイアログを閉じると同時にキャンセル(IDCANCEL)を発行します。SHIDIF_WANTSCROLLBARダイアログが画面に収まらない場合にスクロールバーを表示します。ソースコードは次のとおりです。ダイアログとのデータ受け渡し用。{//ダイアログからのメッセージを処理する。ウィンドウプロシージャで処理する。親ウィンドウのハンドル。SHINITDLGINFO構造でどのメンバーが有効であるかを示すビットフィールドです。SHIDIM_FLAGSを指定します。ダイアログボックスを入力パネルの位置に関係なく、フルスクリーン表示に設定します。ナビゲーションバーにOKボタンを表示します。ダイアログのハンドル。