1.实现全屏
RECT rc;
SetRect(&rc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
::MoveWindow(m_hWnd, rc.left, rc.top, rc.right, rc.bottom, TRUE);
::SHFullScreen(m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);
在你的消息响应函数中加入上面的代码就可以全屏了,无开始菜单,无输入法。
2.恢复正常显示
RECT rc;
SetRect(&rc, 0, 0 + GetSystemMetrics(SM_CYCAPTION), GetSystemMetrics(SM_CXVIRTUALSCREEN), GetSystemMetrics(SM_CYVIRTUALSCREEN) - GetSystemMetrics(SM_CYMENU) - GetSystemMetrics(SM_CYCAPTION) + 3); //这里有个“ + 3” 实在是没办法。
::MoveWindow(m_hWnd, rc.left, rc.top, rc.right, rc.bottom, TRUE);
::SHFullScreen(m_hWnd, SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON);
代码中注释的地方是为了处理客户区的高度不够,在下面会有一条黑线,谁有更好的办法可以交流下。
3.菜单的显示与隐藏。
//创建菜单
SHMENUBARINFO mbi;
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.dwFlags = SHCMBF_HMENU;
mbi.hwndParent = m_hWnd;
mbi.nToolBarId = IDR_MENUBAR1;
mbi.hInstRes = _Module.GetModuleInstance();
SHCreateMenuBar(&mbi);
//隐藏菜单
HWNDhwndMB = SHFindMenuBar (m_hWnd);
::ShowWindow(hwndMB,SW_HIDE); //这里写成 ::ShowWindow(hwndMB,SW_SHOWMAXIMIZED); 会出现菜单全屏的奇观,哈哈。
// 恢复菜单的显示
::ShowWindow(hwndMB,SW_SHOW);
在恢复菜单显示的时候,菜单的句柄hwndMB,只能用上面得到的,如果这里再用 SHFindMenuBar (m_hWnd); 得到的会是一个NULL。我猜测是因为被隐藏了,所以才这样。
关于全屏。在csdn上还有一些代码片段。
要在dlg初始化的时候加入。
SHINITDLGINFO shidi;
ZeroMemory(&shidi, sizeof(shidi));
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_FULLSCREENNOMENUBAR | SHIDIF_SIPDOWN;
shidi.hDlg = m_hWnd;
if(!SHInitDialog(&shidi))
{
return FALSE;
}
这段代码也可以做到。不过我更喜欢上面的那两段代码。呵呵
--------以下文字为 2008.10.6补充----------
今天尝试采用全屏窗口假透明的方式来实现一个 lockscreen 。发现全屏有点小问题。
1.在dlg 或者 view 中直接执行上面列出的代码。手机屏幕顶部的开始菜单栏不能隐藏。在窗体创建过程中发送个消息给窗体本身,模拟按钮消息,可以解决以上问题。
2.当窗体全屏并且假透明的时候,开始菜单栏最右边的关闭按钮得想办法除去。在csdn上找了下。找到一下两行代码:
::SHDoneButton(m_hWnd,SHDB_HIDE);
ModifyStyle(WS_CAPTION,WS_MINIMIZEBOX,SWP_NOSIZE);
试验表明可以成功隐藏右上角的按钮。
----------以下文字 2008.10.7 补充-----------
今天在一个MFC的dlg的工程里面测试上面的代码。发现下面的菜单栏老是去不掉。我代码中没有创建菜单栏或者工具条什么的!
仔细看了下CDialog的代码。发现了下的东西
//删除菜单栏,实际上那不是菜单栏,是个工具条 CControlBar*
m_pWndEmptyCB->DestroyWindow();
delete m_pWndEmptyCB;
m_pWndEmptyCB = NULL;
//隐藏输入法按钮,这个在程序退出以后记得还原回来。呵呵
CWnd* hWndTaskBar = FindWindow(TEXT("MS_SIPBUTTON"), NULL);
hWndTaskBar->ShowWindow(SW_HIDE);