前言
    一些资格较老的CE软件开发师应该还记得CE2.11版的系统界面吧。那时,系统界面比较忠实于PC版的WINDOWS系统界面,导航栏在最下方,“开始”菜单在导航栏的左侧,建立的单文档应用程序占据除导航栏外的整个屏幕,对话框程序带上标题栏后就可以随意拖动,一切都是那么的符合习惯,那么的舒服!
    然而好景不常在,2001年,CE系统进行了一次革命性的升级,推出针对PDA的掌上系统PPC,版本提升到了3.0。这次的升级改变了整个系统界面,导航栏被安排在屏幕的最上方,但最下方还有一个用来放置输入键盘等工具的任务栏。这就使得本来就不大的程序显示界面变得更为紧张!但微软的工程师用了一些小技巧来解决单文档显示界面的紧张问题,方法就是把单文档中的菜单栏默认安置在任务栏。下面是两张效果图,大家可以对比一下:

CE2.11的单文档显示界面

CE3.0的单文档显示界面

单文档全屏
    虽然这种方式的改变对对话框程序是一种“难言的痛”,但对于单文档程序,改变也不算大,只是一些使用习惯的问题而已。可是,谁都希望自己的程序能够在这个巴掌大的PDA上占据尽量大的显示空间,所以,我们可以做一些技术处理,隐藏掉导航栏,实现真正的全屏。
    当菜单栏与最下面的任务栏合并在一起时,要实现单文档全屏,总的来说,只需要在几个位置加一些简单的代码。第一个位置是在CMainFrame::OnCreate函数(如果是SDK编程,相当于WM_CREATE的消息处理部分),在这里,需要添加一个移动窗口的动作,目的就是把程序的窗口移到屏幕的最顶端,代码如下:
RECT          rc; //建立一个矩形变量
GetWindowRect(&rc ); //获取程序框架的窗口矩形位置
rc.top -= 26; //上移26个像素(导航栏的高度正好是26)
MoveWindow(rc.left, rc.top, rc.right, rc.bottom, TRUE ); //移动窗口
移动窗口后,还不能实现全屏,因为还有一个导航栏遮盖在程序的前面。所以我们要增加隐藏导航栏的代码,考虑到要在任何情况下都要隐藏导航栏,所以这些代码需要加在程序活动的时候。因此,我们在CMainFrame::DefWindowProc函数中增加对消息WM_ACTIVATE的处理,代码如下:
switch ( message )
{
case WM_ACTIVATE:
SHFullScreen( this->m_hWnd, SHFS_HIDETASKBAR);
break;
}
很明显,上面最为重要的代码行就是对SHFullScreen函数的调用,该函数属于Shell编程的一部分,第一个参数是程序框架句柄,第二个参数是状态申明,有以下申明(自己的一些翻译,也许会有一点小差异,^_^!):
SHFS_SHOWTASKBAR 使任务栏位于所有的窗口之上。
SHFS_HIDETASKBAR 隐藏任务栏,一个游戏或应用程序需要接管整个屏幕时应该使用该标志。但在使用该标志前应确保其有FULL SCREEN的大小,否则任务栏还是会出现。.
SHFS_SHOWSIPBUTTON 显示键盘
SHFS_HIDESIPBUTTON 隐藏键盘
SHFS_SHOWSTARTICON 显示导航栏上的“开始”。
SHFS_HIDESTARTICON 隐藏导航栏上的“开始”,当隐藏了“开始”,点击导航栏的时候将不会出现下拉“开始”菜单。
    试运行一下,程序已可以全屏显示了,但刹那的光辉不代表灿烂的永恒,这么容易就可以解决的话,也就不叫问题了。
    事实上,对于某些应用程序,输入键盘是一定要的,所以它不可能隐藏键盘,但操作过程中发现,如果弹出键盘后,导航栏将再次出现!前面所做的就犹如“竹篮打水一场空”!
    因此,下面一步至关重要!
    首先,在你的框架声明文件中(默认名字是MainFrm.h)加入一句申明:
afx_msg int OnSettingChange();
    然后,在你的框架实现文件中(默认名字是MainFrm.cpp)加入消息映射:
        BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_SETTINGCHANGE()
//}}AFX_MSG_MAP
        END_MESSAGE_MAP()
    这里就是重点,是对系统参数改变消息的处理,如果你是SDK编程,就是对WM_SETTINGCHANGE消息的处理。好,下面我们为该消息添加处理代码:
        int CMainFrame::OnSettingChange()
        {
       return 1;
        }
    有意思吧,代码处理就是什么都不做,直接就给它返回1。
    再运行程序试试,弹出键盘,怎么样?全屏百分百!
  上面说的是菜单栏与最下面的任务栏合并在一起时的解决方法,对于菜单栏在程序顶端的情况,上面的处理方法还未能实现完全全屏的目标,因为还没有隐藏任务栏,图示如下:      
     
     没有隐藏任务栏
  所以,我们还要对任务栏做隐藏处理。下面我就详细讲解实现的方法和步骤。
  我们第一步要了解的是结构SHINITDLGINFO。这个结构的定义如下:
     typedef struct tagSHINITDIALOG{ 
          DWORD dwMask; 
          HWND hDlg; 
          DWORD dwFlags; 
     } SHINITDLGINFO;
  dwMask:具体什么意思,我也不是很清楚,估计是掩码之类。事实上,现在只有一个取值,就是0x0001。可以用符号SHIDIM_FLAGS代表。
  hDlg:英文翻译就是对话框的句柄,但是在单文档程序中取的是框架的句柄。
  dwFlags:一个至关重要的标志参数。
        SHIDIF_DONEBUTTON -- 在导航栏上显示能关闭程序的“OK”按钮;
        SHIDIF_SIZEDLG --对话框的尺寸,不包括输入面板的位置;
        SHIDIF_SIZEDLGFULLSCREEN ― 全屏尺寸,但忽略输入面板;
        SHIDIF_SIPDOWN - 收起输入面板;
        SHIDIF_FULLSCREENNOMENUBAR - 全屏尺寸,且占据最下部菜单栏的空间。
  明白这个结构后就好办了,只需要加入以下代码就可以实现真正的全屏:
        SHINITDLGINFO     shidi;
        shidi.dwMask = SHIDIM_FLAGS;
        shidi.dwFlags = SHIDIF_SIPDOWN | SHIDIF_FULLSCREENNOMENUBAR;
        shidi.hDlg = this->m_hWnd;
        SHInitDialog( &shidi );
  注意了,以上代码要加在MoveWindow语句之前。
  顺便提醒一下,如果你还想隐藏输入面板的话,就把
          SHFullScreen( this->m_hWnd, SHFS_HIDETASKBAR); 
  改为:
          SHFullScreen( this->m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON );
  最后实现的单文档全屏图示如下:
     

对话框假全屏的关闭和真正全屏的实施

对话框在PPC2000以上也是默认全屏的,无论你的对话框有多小,它就是自动全屏,但遗憾的是,这个全屏不是真正的全屏,因为它始终需要搭配个导航栏和任务栏,把界面搞得非常难看。幸运的是,这只是个默认值,不是固定值。我们可以通过实施某些手段来改变这种状态。
    最简单的方法就是使用对话框新增的一个内部属性m_bFullScreen。这是个布尔变量,当它为TRUE时,对话框全屏;为FALSE时,对话框为实际大小。那么,如何使用该变量呢?这也很简单,只需要在初始对话框前,给这个属性赋值就行了,如下:
        BOOL CXXXDlg::OnInitDialog() 
        {
                m_bFullScreen = FALSE;
                CDialog::OnInitDialog();
        
                return TRUE;
        }
    如果是SDK编程,你就在初始化消息下处理就行了。
    当然,如果这么简单就完了,也就不需要写这种费力不讨好的文章了,屏蔽这个全屏后,你会发现一旦使用键盘,对话框就会回复原型。这是不可接受的,所以,我们还要做一些消息处理,这个消息就是WM_SETTINGCHANGE,处理的地方和方法请参考上面单文档的描述。

上面说了如何屏蔽假全屏,接着就是对话框全屏的实施了,可是,我不打算在这里又罗里罗嗦地把单文档全屏所说的话重复一遍。所以,你如果需要实施对话框的真正全屏,完全可以参照单文档的做法,这里我就偷懒略去了。

顺便说一下,实现全屏的代码移植到对话框下,却只能把最上面的任务栏关闭,不能把屏幕下方那个供输入的那行关闭,不能实现真正的全屏。需要再完成一个工作:

把下边这句加入OnInitDialog()即可:
m_pWndEmptyCB->ShowWindow(SW_HIDE).

PPC扑克牌游戏开发实录 第一篇 之 全屏相关推荐

  1. 81款国学游戏开发教程第一篇(诗词拼图)

    关于写81款国学游戏的初衷,一是为了传承国学,因为那是我们的根,也是未来人们可以创新和革命的根本.革命就是革新,革命的基础就是有命可以革.二是为了让那些想学习游戏开发的人提供参考,三是为了让自己写的游 ...

  2. Python 打字小游戏开发,来体验不一样的打字游戏乐趣(第一篇)

    Python 打字小游戏开发,来体验不一样的打字游戏乐趣(第一篇) 前言 游戏素材准备 游戏项目结构 项目里面的类说明 Python 打字小游戏开发,来体验不一样的打字游戏乐趣(第二篇) Python ...

  3. 游戏开发心得——书籍篇——《游戏引擎框架》-导论

    游戏开发心得--书籍篇--<游戏引擎框架>-导论 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 学习<游戏引擎框架> ...

  4. 游戏开发面试答案篇(一)-- C++篇​

    游戏开发程序岗面试题答案版C++篇,后续继续更新游戏逻辑篇.unity篇.图形学篇,并整理成文档,可在公号[游戏君五尘]获取 原文链接 游戏开发面试答案篇(一)-- C++篇​ 目录 一.基础语法 二 ...

  5. Cocos2D手机游戏开发之优化篇

    Cocos2D手机游戏开发之优化篇 在这个手机游戏盛行已久的年代,一款产品想要博得更多用户的喜爱就要在细节上做得更加到位.而游戏的优化在这里面起到了非常关键的作用.试想下,一款画面和玩法都深受用户喜欢 ...

  6. 普元EOS开发积累第一篇(常见错误解决方法) 持续更新

    普元EOS开发积累第一篇(常见错误解决方法) 持续更新 参考文章: (1)普元EOS开发积累第一篇(常见错误解决方法) 持续更新 (2)https://www.cnblogs.com/tangjing ...

  7. Python开发【第一篇】:目录

    本系列博文改编自武沛齐老师的原创博文,主要包含  Python基础.前端开发.Web框架.缓存以及队列等内容 ,用于学习记录成长!!! Python开发[第一篇]:目录 Python开发[第二篇]:初 ...

  8. 游戏开发心得——书籍篇——《游戏引擎框架》-专业工具

    游戏开发心得--书籍篇--<游戏引擎框架>-专业工具 FOR THE SIGMA FOR THE GTINDER FOR THE ROBOMASTER 简介: 学习<游戏引擎框架&g ...

  9. 游戏开发总结-java篇

    游戏开发总结-java篇 前言 网络通信 数据存储 逻辑开发 逻辑开发一般遇到的问题有: Java游戏服务器方面的开发要掌握的技术: java服务器目前主流框架技术 前言 Java语言,由于学习成本低 ...

最新文章

  1. 车联网技术对中老年人吸引力更大
  2. gen_cam_par_area_scan_division和gen_cam_par_area_scan_polynomial区别
  3. python代码大全p-如何写出优雅又地道的Python代码?【转载】
  4. RHCSA笔记整理(1)
  5. Python自动化开发学习22-Django下(Form)
  6. Vector, ArrayList, LinkedList分析
  7. 小白白红队初成长(5)win权限维持
  8. visual foxpro v6.0官方版
  9. 详细分析”百词斩“数据库,如何实现一个良好的数据库系统?
  10. MyBatis入门到精通
  11. 尊严与爱——论《简爱》的价值观
  12. oracle remap schema,impdp的remap_schema选项的另一个schema是否要重建
  13. 谷露专访伯周咨询创始人Tiger Pan:在退潮后蜕变
  14. 梯度下降法算法比较和进一步优化
  15. 读书档案-心流:最优体验心理学
  16. XDC约束技巧之I/O篇(上)
  17. 高质量 iOS 博客推荐(iOS界技术大牛)
  18. 【良心】C语言零基础学习,C语言初学者入门基础知识讲解
  19. linux下防止rm-rf /处理
  20. Xshell连接虚拟机失败,解决办法!

热门文章

  1. Oracle分析函数(每组数据取一条记录)
  2. EZ-USB FX2 LP CY7C68013A 开发指南(1)--基本概念
  3. 2020-05-31
  4. 关于安阳工学院ACM实验室纳新问题解答
  5. VITESS User Management and Authentication for minikube
  6. python os 模块
  7. 01矩阵最大正方形面积、01矩阵最大矩形面积、直方图最大矩形面积
  8. 算法:(二)枚举(穷举)算法
  9. 论文投稿时,期刊编排要求将多张图片整合成一块,且格式为jig格式;dpi值为300等诸如此类。此时,用origin怎么做呢?接下来为大家讲解:利用origin将多张图片合并、排列并导出的方法。
  10. 【AcWing】AcWing 2. 01背包问题