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プログラミングへ移ってしまった人が言ってみる(´ω`)