CEで全画面表示(1)
専用アプリケーションを作成するネタの続きです(・∀・)
Windows MobileなPDAで全画面表示を行う場合、SHFullScreen() APIを利用します。
ただ、SDKベースでは上手くいくのに、MFCのCDialogベースでは上手くいかないという意見を聞くことがあります(´・ω・`)
MFCは所詮Win32の薄いラッパーにすぎないというわけで、MFCのソースを読むとその理由がわかります。
答えを言ってしまうと、WM_SETTINGCHANGE、WM_ACTIVATEのハンドラをoverrideして、CWndのハンドラの呼び出しと、WM_ACTIVATEではSHFullScreen()の再呼び出しを行えばOKです。
後、OnInitDialog()では以下の様な処理を行っています。
CRect rcMenu; ::GetClientRect( ::FindWindow( _T("HHTaskBar"), NULL ), &rcMenu ); CRect rc; SHINITDLGINFO shidi; ::ZeroMemory( &shidi, sizeof(SHINITDLGINFO) ); shidi.dwFlags = SHIDIF_SIPDOWN; shidi.dwMask = SHIDIM_FLAGS; shidi.hDlg = m_hWnd; ShowWindow( SW_SHOW ); UpdateWindow(); // CB:現状では作ってから消してる ::CommandBar_Show( m_pWndEmptyCB->m_hWnd, FALSE ); shidi.dwFlags |= SHIDIF_FULLSCREENNOMENUBAR; ::SHInitDialog( &shidi ); GetWindowRect( &rc ); rc.top -= rcMenu.Height(); MoveWindow( rc.left, rc.top, rc.right, rc.bottom, TRUE ); ::SetForegroundWindow( m_hWnd ); DWORD dwState = SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON; ::SHFullScreen( m_hWnd, dwState );
その他、色々な仕掛けを入れたCDialog派生クラスを用意して、アプリケーションのメイン画面はそれを継承するようにしています。