代码改变世界

windows mobile 隐藏菜单栏,标题栏等

2010-12-10 13:23  zlty  阅读(1935)  评论(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);
		}
	}
}

最好自己动手试验下.