CEで全画面表示(1)

専用アプリケーションを作成するネタの続きです(・∀・)


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