Pocket PC Dialog Full Screen

来源:互联网 发布:强氧科技淘宝 编辑:程序博客网 时间:2024/06/06 21:43

这两天在项目上有这样一个需求:在Pocket PC/Smartphone上全屏显示界面。听完后觉得很简单,于是迅速着手实施。

  刚开始,我想到的是SHFullScreen这个API。来看看MSDN上对这个方法的介绍:

BOOL SHFullScreen ( HWND hwndRequester, DWORD dwState);
This function can be used to take over certain areas of the screen. It is used to modify the taskbar, Input Panel button, or Start menu icon.

其中dwState可以是:

SHFS_SHOWTASKBAR SHFS_HIDETASKBAR SHFS_SHOWSIPBUTTON SHFS_HIDESIPBUTTON SHFS_SHOWSTARTICON SHFS_HIDESTARTICON

光从这个参数的选项上就可以看出来,完全可以使用这个API来实现我的需求了。于是,我在我的函数中增加了这样一个方法:

void CMWatchHistoryDlg::OnFullScreen(BOOL bFullScreen)
{
   SetForegroundWindow();

   if(bFullScreen)
   {  
        GetWindowRect(&m_rcSave);

        SHFullScreen(m_hWnd, SHFS_HIDETASKBAR|SHFS_HIDESTARTICON|SHFS_HIDESIPBUTTON);

        MoveWindow(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), TRUE);
    }
   else
   {
       SHFullScreen(m_hWnd, SHFS_SHOWTASKBAR|SHFS_SHOWSIPBUTTON|SHFS_SHOWSTARTICON);
       MoveWindow(m_rcSave);
   }
 }

添加成功以后,运行,结果却不尽如人意。因为我的Dialog上存在着两个自定义的按钮,在我调用了我的全屏的方法以后,屏幕下方仍然存在着这两个Menu。显然光光调用这SHFullScreen这个API是不能解决问题了。

  于是上网google了一下,发现需要查找到自定义的Menu的句柄,然后将其隐藏起来。于是又有了这个API SHFindMenuBar,顾名思义,它就是能检索到Menu的API了,于是在代码中曾加如下代码:  

    隐藏时增加:HWND hmenBar = ::SHFindMenuBar(m_hWnd);
    ::ShowWindow(hmenBar, SW_HIDE);

    显示时增加:HWND hmenBar = ::SHFindMenuBar(m_hWnd);
    ::ShowWindow(hmenBar, SW_SHOW);

 编译运行,发现虽然我的自定义的Menu成功隐藏了,但是这时候屏幕下方的spin Button又没能成功隐藏,我就很奇怪,左思右想,不能明白。因为要全屏显示的Dialog是有别的Dialog使用非模态的方式弹出来的,起初我以为是前一个Dialog引起的,因为前一个Dialog同样有自定义的menu存在。于是我在OnFullScreen中增加全屏前一个Dialog的方法,编译运行,仍然不行。屏幕下方的Spin Button仍然完好无缺的显示着。

   于是我不停的查资料,尝试了,为了测试方便,我新建了一个单文本的工程,由主窗口弹出一Dialog,然后再全屏显示Dialog。真是误打误着,我发现主页面能被完整的全屏,而Dialog却始终不能,然后在网上搜索相关文章,发现一篇:http://support.microsoft.com/default.aspx?scid=kb;%5Bln%5D;266244。里面大概是说,如果要全屏显示Dialog的话,必须要保证对话框上的所有控件都必须去除tabstop属性,可是我的Dialog没有任何控件存在。这毕竟是Microsoft Help and support网站啊,不敢大意,我甚至将Dialog上的menu都使用SetWindowLong去除掉TabStop属性,可是怎么都不行。

   经过将近一天的尝试,始终解决了问题,方法如下:

在OnInitDialog里面创建自己的MenuBar之前,首先保存空的Menubar的句柄:

m_hEmptyMenuBar = ::SHFindMenuBar(m_hWnd);

然后在全屏的方法里:

void CMWatchLiveDlg::OnFullScreen(BOOL bFullScreen)
{
 ::SetForegroundWindow(GetSafeHwnd());

 if(bFullScreen)
 {  
  GetWindowRect(&m_rcSave);

  if(m_hEmptyMenuBar)
   ::ShowWindow(m_hEmptyMenuBar, SW_HIDE);

  if(m_hMenuBar)
   ::ShowWindow(m_hMenuBar, SW_HIDE);

  SHFullScreen(m_hWnd, SHFS_HIDETASKBAR|SHFS_HIDESTARTICON|SHFS_HIDESIPBUTTON);
  MoveWindow(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), TRUE);

 }
 else
 {

  if(m_hEmptyMenuBar)
   ::ShowWindow(m_hEmptyMenuBar, SW_SHOW);

  if(m_hMenuBar)
   ::ShowWindow(m_hMenuBar, SW_SHOW);

  SHFullScreen(m_hWnd, SHFS_SHOWTASKBAR|SHFS_SHOWSTARTICON|SHFS_SHOWSIPBUTTON);
  MoveWindow(m_rcSave);
 }
}

通过这种方法就可以实现的PocketPC上的全屏操作了。

原创粉丝点击