AP的全屏与非全屏的切换

Posted on 2007-09-25 15:03  啊夏  阅读(2045)  评论(1编辑  收藏  举报
     在CSDN上看到很多问怎么在PPC上实现程序全屏的。我这里收集整理了一下。先帖出我测试通过的代码。

  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);