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派生クラスを用意して、アプリケーションのメイン画面はそれを継承するようにしています。