Published by orzz.org(). (https://orzz.org/windows-mobile-5-%e4%b8%ad%e5%85%a8%e5%b1%8f%e7%aa%97%e5%8f%a3%e6%95%88%e6%9e%9c%e7%9a%84%e5%ae%9e%e7%8e%b0/)
想在 Windows Mobile 系统中实现全屏效果,需要考虑两个方面.
如下图所示的 Mobile 系统界面,需要隐藏屏幕上部的任务栏,下部的菜单栏.
- 隐藏任务栏
方法有两种,一种是彻底隐藏,另一种是利用api调整任务栏的显示.
- 1.彻底隐藏任务栏
1 2 3 4 5 6 7 8 9 10 |
// 隐藏任务栏 CWnd* pWndTask = FindWindow( _T("HHTaskBar"), NULL ); if ( pWndTask ) { pWndTask->ShowWindow(SW_HIDE); } CRect rc; SetRect( &rc, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) ); MoveWindow( rc ); |
使用这种方法的时候记得在程序退出的时候必须将任务栏还原,否则任务栏是不会自动出现的.
- 2.利用 SHFullScreen 隐藏任务栏
1 2 3 4 5 6 7 |
SetForegroundWindow(); DWORD dwState = ( SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON ); ::SHFullScreen( m_hWnd, dwState ); CRect rc; SetRect( &rc, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) ); MoveWindow( rc ); |
这种方法隐藏任务栏,在程序退出的时候不需要做什么特殊处理.但是在对 CWnd, CFrameWnd 一类的窗口做处理的时候一定要先 SetForegroundWindow 一次,而 CDialog 类型的窗口则不需要这一步.
另外在对 CWnd, CFrameWnd 类型窗口做处理的时候,还必须响应 WM_ACTIVATE 消息,在其中做同样的处理才能做到完全的隐藏任务栏效果.
由于此消息在程序退出及窗口切换的时候也被调用,因此直接在其中响应消息,会导致程序退出之后任务栏的刷新问题,及程序窗口无法切出.解决办法是设置成员变量判断程序是否退出,并检测此消息的参数来判断是否切换窗口.相关代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CFrameWnd::OnActivate(nState, pWndOther, bMinimized); if( !nState && !pWndOther ) return; if( !m_bExit ) { // 全屏窗口 SetForegroundWindow(); DWORD dwState = ( SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON ); ::SHFullScreen( m_hWnd, dwState ); CRect rc; SetRect( &rc, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) ); MoveWindow( rc ); } } |
- 隐藏下方的菜单栏
这个基本只有一种方法,同上面隐藏任务栏的第一种方法类似:
1 2 3 4 5 6 |
// 隐藏输入法栏 CWnd* pWndSIP = FindWindow( _T("menu_worker"), NULL ); if ( pWndSIP ) { pWndSIP->ShowWindow(SW_HIDE); } |
在程序退出的时候也必须将该窗口还原,否则此栏将不会自动出现.
在很多时候,我们仅需要隐藏任务栏,而对下方的输入法栏并不需要隐藏,如手机QQ的做法.但是在这个时候,弹出输入法软键盘的时候,屏幕上窗口将会自动向下收缩并露出上方被隐藏任务栏的区域.
解决方法是在主窗口里响应 WM_WININICHANGE 消息即可,不需要在里面添加自定义代码如下:
1 2 3 4 5 6 7 |
// 按动输入法时不自动弹出任务栏 void CMainFrame::OnWinIniChange(LPCTSTR lpszSection) { CFrameWnd::OnWinIniChange(lpszSection); // TODO: 在此处添加消息处理程序代码 } |