Flash builder程序运行时全屏模式运行,而且用户按ESC键时,也不退出全屏模式。

      很多桌面程序运行时都是要求全屏显示,而且在退出程序之前不允许程序退出全屏模式回到一般模式(这类程序跟流氓程序不一样,因为永我仅是屏蔽了ESC键,如Alt+Tab键,Win+D键都还没有屏蔽,用户还是可以在运行该程序时正常使用其它程序)。为了实现这一功能,Google了N回,也未能找到正确的解决方法。但我从桌面程序设计的角度去思考这一问题,我认为这一问题肯定是能解决的,而且应该很简单!可就是这一问题,题整整花了我一个下午 + 一个晚上的时间!!!  人都差点被这玩意整疯了!

 

在网上一搜,关于全屏如何实现很简单(这方面的网页也很多),具体方法如下:

在窗体初始化函数中加入:this.stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;即可实现。

因为AIR应用程序的主场景拥有一个displayState属性,同时AIR的运行时框架中也包含了一个StageDisplayState类,这个类为三种不同的场景模式定义了3个静态常量。使用这些类你可以让你的AIR应用程序进入下述的任意一种模式:

1.// Enter Fullscreen Interactive State
 stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;
2.// Enter Standard Fullscreen State
 stage.displayState = StageDisplayState.FULL_SCREEN;(注意这种方式下程序的所有输入控件(如TextInput控件)不响应键盘的按键)
3.// Enter Normal State
 stage.displayState = StageDisplayState.NORMAL;

使用stage.displayState = StageDisplayState.FULL_SCREEN_INTERACTIVE;确实可以实现程序全屏模式运行,但用户只要按下ESC键,程序就回到了Normal State。

 

接下来解决——用户按ESC键也不能退出全屏模式。

解决思路:肯定是捕获用户按键,然后把按下ESC键的消息杀掉(说法可能不太专业,没法,对flash builder还是新手^_^)。即可解决问题!

首先:捕获用户按键

同样在窗体初始化函数中加入 addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 注册KeyboardEvent.KEY_DOWN事件侦听器对象,只要用户一按键就会转到onKeyDown处理函数处理(如下)。

private function onKeyDown(evt:KeyboardEvent):void
   {
    if(evt.keyCode == 27){ 
      Alert.show("ESC Key Pressed!");

    }       
   }

用户按键也能正常捕获了,但我捕获到ESC按键后,如何在消息队列(我是按C++理解flex也是消息驱动机制的,是否理解正确我还真不是很肯定)中杀死该按键消息呢? 我陷入了困境之中……

除了使劲的问Google,真的别无他法了! Google, Google ,Google ……

终于在看人家的屏蔽鼠标右键的程序中看到了一个别人在鼠标按键事件响应函数中有这么一句话:e.stopPropagation();

看到了这一句,这还了得,一发不可收拾呀!哈哈……灵感来了

我马上去查看evt:KeyboardEvent对象有那些方法,结果看到了一个preventDefault()方法。问题得以解决,程序全屏运行时用户按ESC键也不能退出全屏模式。

 

好景不长久呀!结果我就多玩了一下这个功能结果有发现了一个新的问题,而且这一问题也耗我时间不少!就当程序刚运行时,如果没有那一个Text控件获得输入焦点的话,只要用户按任何键,程序都无法捕获用户按键(即使你用鼠标点击该应用程序)。这就奇怪了!程序的这一现象表明:整个桌面正在运行的程序中该flash builder程序好像不是活跃的当前窗口程序,但其它语言写得程序都是刚运行程序时,该程序就是当前活跃程序呀,即使不是通过用户鼠标点击该应用程序也可以使该程序变为当前活跃程序,为何flash builder开发出来的桌面程序就不遵循这一规则了呢?!百思不得其解!我又再次陷入了困境之中……

为了解决问题,我使劲的在Google上搜索相关flash builder程序获得焦点的内容。结果找到了在窗体初始化函数中加入

          this.stage.focus = this;

这句话(其意思一看就知道,不多解释了),结果我原本以为问题解决了,可以百试不爽了!结果问题由来了,前面的问题似乎解决了,但当进入全屏后,用户Alt+Tab键 或 Win+D键之后,再进入该程序,在没有某一输入控件获得焦点的情况之下,用户按ESC键时,又会推出全屏模式。

我又再次陷入了困境……同时我也快要疯了,这在c++或者VB之类程序设计中,实现这一功能是何其的简单!而在这个FB4中,却变得如此之棘手!!!我能不疯吗?!

疯归疯,问题还是得解决呀!仔细分析问题所在,我认为还是在给stage设置焦点或者注册捕获用户按键的事件侦听器这二者那里出了问题,设置不正确。 继续Google,再Google,再Google……结果还是无解,我跑去救助于flex的帮助系统。去查看stage的帮助文档,结果我看到了stage同样有一个addEventListener方法。此时我极其兴奋,似乎如袁隆平当年第一次在安江农校找到了第一株水稻雄性不育株一样!(当然这等小事的作用是没法跟袁老的发现相比,不要乱码我了)。于是乎,问题全部得到解决!嗨……这么一桩小事耽误了这么多的时间,还有很多事情没完成呢!

分析这件事情的原因,我知道了,为什么我的程序不遵循一般桌面程序设计的规则(指我在上面提到的一个规则),因为flash builder 或 flex它主要是用于web程序开发的,所以的设计模式都是web程序开发的思维,而不是传统的桌面程序的设计思维。以前有一次也是花了很多时间去解决一件很简单事情(后面分析原因也是自己不理解web程序开发思路造成的),我才知道问题的本质在于我对flash builder程序设计的整体思路与其构架不了解,还是用C++的思维去理解它,能不撞得头破血流吗?!有几分杯具呀~!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值