CEで全画面表示 WM5.0編 (2)
昨日は久しぶりにPDAプログラミングのネタを書いてみたんですが、せっかくなので、今日も続けてみます(・∀・)
昨日の事があったので、昔作った全画面表示のサンプルアプリケーションをVisual Studio 2005環境に移行して、Windows Mobile 5.0のエミュレータで動くようにしてみました。
W-ZERO3とか持っていないので、あくまでエミュレータ上だけでのテストですが。
で、このサンプルで使用している自作ライブラリはeVC++ 3.0時代からのものもあって、以前にVisual Studio 2005でとりあえずビルドだけは通るようにしていたんですけれど。
まあ、実際に使ってみると、動きに問題があるところもあったりして(´・ω・`)
その1つとして、CDialog派生クラスを利用した画面遷移機能がありました。
自作ライブラリでは、全画面表示をしたメインダイアログの中で、CDialog派生の子画面をWizard的に切り替えて画面遷移をする仕組みを用意していました。
で、この子画面の方にもCCeCommandBarをゴニョゴニョする仕掛けが入っていたので、その部分をWindows Mobile 5.0用に変更する必要がありました。
まあ、結局はここも「m_bFullScreen = FALSE」にしてみただけなんですけど(´ω`)
そもそも「m_bFullScreen = FALSE」の意味はなにかというと、MFCのソース(dlgcore.cpp)の中身を覗くと答えがわかります。
以下、MFCのソースよりの抜粋です。
BOOL CDialog::OnInitDialog() { ... #ifdef _WIN32_WCE int aygshellUIModel = AfxGetAygshellUIModel(); if ((aygshellUIModel == PocketPC || aygshellUIModel == Smartphone) && m_bFullScreen) { ... ::SetForegroundWindow(m_hWnd); if (!AYGSHELL::SHInitDialog(&shidi)) { ... } } #endif // _WIN32_WCE ... }
つまり、標準のCDialogの動作ではOnInitDialog()中でSHInitDialog()を呼んでいるわけですが、用途によってはコレが余計なお世話になるわけです(´ω`)
で、上の方を見ると、この処理が走る条件が書いてあります。
PocketPCかSmartphoneかはともかく、「m_bFullScreen = FALSE」の場合にはSHInitDialog()は走らないということで、これが小細工をしている理由になります。
っというわけで、SDKベースだとうまくいくけどMFCベースではなんか変みたいな時には、MFCのソースを覗いてみることをお奨めします(・∀・)
MFCって所詮はWin32の薄いラッパーライブラリですしね。
…っと、最近はすっかりMFCプログラミングから.NETプログラミングへ移ってしまった人が言ってみる(´ω`)