hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

WindowsMobileのダイアログボックスのメニューバーについて

EBPocketのWM5版で公開以来ずっと悩まされていた問題に、「画面を閉じてTODAY画面を表示したときに、TODAY画面のメニューバーのメニュー(連絡先など)が消える」というものがあった。サポート掲示板でも公開直後から報告されていたが、調べてもわからなかった。あきらめかけていたところ、ひょんなことで原因がわかり、とりあえず回避することに成功した。

表面的な現象の回避

EPWING広辞苑にはカラー図版というグラフィカルなメニューがある。EBPocketは自分自身の主ウィンドーと別に、カラー図版用のポップアップウィンドーを持っている。カラー図版用のポップアップはEBPocketの起動直後に作られるが、普段は隠れており、メニューから図版メニューを読んだときだけポップアップする。EBPocketを閉じてもTODAY画面のメニューが隠されていた原因は、カラー図版用のポップアップウィンドーにあった。そこでカラー図版を実際に呼び出すときまでポップアップウィンドーを作らないようにして、とりあえず障害を回避した。
だがこれは、真の問題解決ではなく、現象を隠しただけである。今回、本当の問題と解決策がわかったので、以下に報告する。(たぶん同じ問題にはまる人がこれからもいると思うので…)

真の原因と問題解決

PocketPCのダイアログボックスは、メニューバーを隠すために空のメニューバーが作られる。eVC++4.0の時代は、CDialog の m_pWndEmptyCBというメンバでこの空のメニューバーにアクセスできた。もともとEBPocketではm_pWndEmptyCBを使って空のメニューバーを削除していた。
ところがVisualStudio2005になってm_pWndEmptyCBメンバは削除されたので、コンパイルエラーを回避するためにコメントアウトした。ところが m_pWndEmptyCBは無くなっても、空のメニューバー自体はVisualStudio2005でも存在する。これがTODAY画面のメニューを隠していた。

eVC++4.0とVS2005のどちらでも、空のメニューバーを消すコーディングは次の通りである。


#if defined(_WIN32_WCE_PSPC) && (_WIN32_WCE >= 212)
#if (_WIN32_WCE >= 500)
HWND cmdBar=::SHFindMenuBar(this->GetSafeHwnd());
::ShowWindow(cmdBar,SW_HIDE);
#else
m_pWndEmptyCB->DestroyWindow();
#endif
#endif

これですっきり問題が解決した。