windows mobile 隐藏菜单栏,标题栏等
2010-12-10 13:23 zlty 阅读(1943) 评论(0) 编辑 收藏 举报先引用别人的一张图来说明什么是标题栏,菜单栏.
(图的出处:http://www.cppblog.com/guogangj/archive/2010/08/03/122035.aspx)图的作者说他的方法可以比较好的实现全屏.但是我在6.0模拟器上无法隐藏菜单栏.其他的Task Bar,Start Icon,SIP Button都可以用API实现
//隐藏 //SIP BUTTON SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON); //Task Bar SHFullScreen(m_hWnd, SHFS_HIDETASKBAR); //Start Icon SHFullScreen(m_hWnd, SHFS_HIDESTARTICON); //显示 //SIP BUTTON SHFullScreen(m_hWnd, SHFS_SHOWSIPBUTTON); //Task Bar SHFullScreen(m_hWnd, SHFS_SHOWTASKBAR); //Start Icon SHFullScreen(m_hWnd, SHFS_SHOWSTARTICON);
可能原因是我使用的MFC创建的dialog.相信如果使用win32创建dialog的话可以不创建菜单栏.那自然就不存在不可隐藏的问题了.
经过我baidu,google之后找到一个比较靠谱的方法.之所以说比较靠谱是因为网上大部分方法都是用FindWindows,之后再showwindow(hwnd,SW_HIDE);这种比较"冒险"的方式
如下
CWnd* pWndSIP = FindWindow( _T("menu_worker"), 0 ); if ( pWndSIP ) { pWndSIP->SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); pWndSIP->ShowWindow(SW_HIDE); } pWndSIP = FindWindow( _T("MS_SIPBUTTON"), 0 ); if ( pWndSIP ) { pWndSIP->SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); pWndSIP->ShowWindow(SW_HIDE); } pWndSIP = FindWindow( _T("HHTaskBar"), 0 ); if ( pWndSIP ) { pWndSIP->SetWindowPos(&wndBottom , 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE); pWndSIP->ShowWindow(SW_HIDE); }
上面方法在程序非法退出之后,导致Task Bar等不能正常显示.谁都不能保证自己程序永远不异常.
再说说靠谱的方法.
(参考网址:http://blog.csdn.net/tozheng/archive/2010/03/02/5338540.aspx)注意看第二点.
作者使用了一个两个API,
//m_hwnd指dialog的HWND HWND hMenu=SHFindMenuBar(m_hwnd); if(NULL!=hMenu) { ShowWindow(hMenu, SW_HIDE) }
同时作者也指出
并没有彻底隐藏菜单栏,而是隐藏了你自己的菜单,也就是说如果你执行ShowWindow(SHFindMenuBar(hwnd), SW_HIDE)一次后,会看到屏幕仍旧有一个空的菜单栏,只是原先有字的菜单不见了。 这是为什么呢? 事实上,原因是,一个窗口在没有建立用户自定义菜单时,已经有了一个默认菜单 ShowWindow(SHFindMenuBar(hwnd), SW_HIDE)之后 你再去SHFindMenuBar(hwnd),又会得到一个句柄,你得再把它隐藏掉。当然,如果你没有构造自定义菜单,那只有一个默认菜单。
最后给出我的代码
//这种方式不管你有没有自己创建菜单,都可以比较好实现隐藏 void CBaseDlg::ShowMenuBar(BOOL bShow) { if (TRUE==bShow) { if(NULL!=m_hMenu1) {//显示自己创建的或MFC创建的 ::ShowWindow(m_hMenu1, SW_SHOWNORMAL); } if(NULL!=m_hMenu2) {//注意这里不再需要,否则如果你自己创建了菜单.那么会交替显示/不显示菜单.表达不清了.自己试验下 //::ShowWindow(m_hMenu2, SW_SHOWNORMAL); } } else { m_hMenu1=SHFindMenuBar(m_hWnd); if(NULL!=m_hMenu1) {//隐藏自己穿件的菜单 ::ShowWindow(m_hMenu1, SW_HIDE); } m_hMenu2=SHFindMenuBar(m_hWnd); if(NULL!=m_hMenu2)//如果自己没有创建菜单这里获取的将会是NULL { ::ShowWindow(m_hMenu2, SW_HIDE); } } }
最好自己动手试验下.