20 April 2008

(Windows Mobile) 全画面表示、閉じるボタン非表示

Windows Mobile (Windows CE) で全画面表示する方法。

20080420-normalwnd.png

組み込み用 eMbedded Visual C++ で MFCのCDialogをメインウインドウとして利用している場合

C++/MFC タスクバーの閉じるボタンを消す

BOOL CSystemMenuDisableTestDlg::OnInitDialog()
{
m_bFullScreen = FALSE;

CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

CenterWindow(GetDesktopWindow()); // center to the hpc screen

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

20080420-deletebutton.png

C++/MFC 全画面表示する

BOOL CSystemMenuDisableTestDlg::OnInitDialog()
{
m_bFullScreen = FALSE;

CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

CenterWindow(GetDesktopWindow()); // center to the hpc screen

// TODO: Add extra initialization here
SHINITDLGINFO shidi;
RECT rc;

shidi.hDlg = this->m_hWnd;
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_FULLSCREENNOMENUBAR;
SHInitDialog(&shidi);

::GetWindowRect(this->m_hWnd, &rc);

// コマンドバー(画面下部のメニューバー)を非表示にする
::CommandBar_Show(this->m_pWndEmptyCB->m_hWnd, FALSE);

// タスクバーとSIP(入力パネル)を非表示にする
::SetForegroundWindow(this->m_hWnd); // このウインドウを前面に持ってくる
::SHFullScreen(this->m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);

// ダイアログを画面全体に表示
#define MENU_HEIGHT 26
::MoveWindow(this->m_hWnd, rc.left, rc.top-MENU_HEIGHT, rc.right, rc.bottom, TRUE);


return TRUE; // return TRUE unless you set the focus to a control
}

20080420-fullscreen.png

なお、m_bFullScreen = FALSE を CDialog::OnInitDialog(); より前に定義しないと、SIPが消せない。(Windows Mobile 5.0 以降のみ)
20080420-fullscreen-sip.png


C# で .NET Compact Framework の Form を利用する場合

ただし、コマンドバーの消し方が分からない…
(オーバーライド関数は、”protected override”まで入力して、スペースキーを押すとメンバ一覧が表示される)

C#/.NET Compact Framework 全画面表示する

namespace SystemMenuDisableCSharp
{
/// <summary>
/// Form1 の概要の説明です。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button_close;
private System.Windows.Forms.Button button_fullscreen;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.MainMenu mainMenu1;

[DllImport("aygshell.dll")]
private static extern bool SHFullScreen(IntPtr hWnd, uint dwState);

[DllImport("coredll.dll")]
private static extern bool MoveWindow(IntPtr hWnd,int X,int Y,int nWidth,int nHeight,bool bRepaint);

[DllImport("coredll.dll")]
private static extern int GetSystemMetrics(int nIndex);

[DllImport("coredll.dll")]
private static extern IntPtr GetCapture();


// 中略

protected override void OnLoad(EventArgs e)
{
int nWidth, nHeight;

this.Capture = true;
IntPtr hWnd = GetCapture();
this.Capture = false;

nWidth = GetSystemMetrics(0); // SM_CXSCREEN = 0
nHeight = GetSystemMetrics(1); // SM_CYSCREEN = 1

SHFullScreen(hWnd, 0x20|0x02|0x08); // SHFS_HIDESTARTICON=0x20, SHFS_HIDETASKBAR=0x02,SHFS_HIDESIPBUTTON=0x08
MoveWindow(hWnd, 0, 0, nWidth, nHeight, true);


base.OnLoad (e);
}

20080420-fullscreen-cs.png
C#で、コマンドバーが消せない…

参考:マイクロソフト サポートオンライン 「PocketPC 用の全画面アプリケーションを作成する方法