silverlight for windows embbed 的键盘处理之一
时间:8:57 2010-10-29
环境:
开发环境:VS2008 +XAML2CPP.EXE + SWE 2 + BLEND 2
运行环境:WINCE 6.0 R3
硬件加速: DirectX
联系:
网站: http://www.pvontek.com
E-MAIL: pengxinglove@gmail.com
QQ群: 38076553
主题: 键盘操作
任务
向图1所示的界面添加键盘操作
图1 系统主界面
操作说明:
其的操作规则与操作菜单是一样的,具体规则如下:
ESC 键含义:
1. 退出子菜单 回支父菜单 2.退出程序(退出只限于子程序,而对于总控制台的程序其是不能够退出
ENTER 键含义:
1. 确认选择 包含以下两点:A. 由父菜单到子菜单(子菜单其的第一项要改变背景)
B.由菜单子项进入到应用程序(启动应用程序)
向上(UP):
其是完成向上选择(包括父子菜单)
向下(DOWN) :
完成向下选择(包括父子菜单)
向左(LEFT):
在父子菜单中完成由子菜单到父菜单的跳转,在数据处理的环境当中,其是进行添 加
向右(RIGHT):
在父子菜单中完成,父菜单向子菜单的跳转,
PS:在处理的过程当中要注意到其之间效果的改变
实现
在MFC当中,此界面是使用BitBlt的方式来进行的实现 ,也就是全部使用图片粘贴上去的.其工作量很大且很烦人的,如: 界面的描点布局, 鼠标事件的处理,键盘事件的处理
当今SWE年代,我们已经体味了其的好处, 期待着SWE其能给我们惊喜
MFC年代
在MFC的BITBLT环境下编程,对于键盘操作是一件很烦人的事情.
如图1, 为其添加键盘操作
一个对话框其负责接收WM_KEYDOWN,WM_KEYUP消息,
其首先判断是哪一种类的键被按下,
如VK_ESCAPE, VK_RETURN,VK_LEFT,VK_RIGHT,VK_UP,VK_DONW
然后分类处理: 因为分为菜单与子菜单的两种情况,
其首先 判断焦点在菜单当中还是子菜单当中,
然后根据各种情况处理.
如果发把这个过程命名的话,觉得叫做: 手动事件路由.
这个过程可以看到是一种能量消耗,我们应该避免这种能量消耗, 让开发人员只要专注于业务逻辑的处理.
SWE年代
在SWE当中,那些图片其是一些真正的UI 控件,其可以接收焦点,可以注册鼠标事件,键盘事件.
我们基本思路是:以控件为中心,: 控件注册键盘事件,然后在事件代码当中直接进行逻辑的实现.
我以菜单[照片]photo 按键为例说明:
1. 注册 键盘事件
2. 进行逻辑处理
其他的控件也是类似的处理.
在SWE当中我们是直接的进行业务逻辑的处理,而中间事件的路由则由SWE框架来完成了.
后续
此部分,记录了我学习过程当中的想法. 所以段与段之间可以没有逻辑,以段为单位吧
但中心的都是: 怎么样解决按键处理. --> 技术散文( 刚想出来的)
全局思考
现在我们已经在SWE年代当中.
MS 的SWE开发人员其是怎么样来思考与处理这个问题的.
我们的自身首先要明确两个种接口的问题:
1.用户的接口:( 使用软件的人)
用户的操作流程是什么呢.
2.我们APP 开发人员想要的接口是什么呢.
最好是不要写代码.可视化点点划划就可以了.
对于各种按键的处理,控件自身与SWE框架之间应该已经建立好了初步
用户只要业务逻辑的处理.如是:VK_RETURN ,其就可以进行业务逻辑的处理.
键盘操作与鼠标操作的支持.其本质就将是对于焦点的处理.
MS的SWE开发人员的两个接口:
1. 用户的接口( 使用此SWE库的人)
用户其只要怎么样做,就可以方便的完成任务
2. MS的SWE自身的开发人员
使用什么样的设计模式来实现了,
对于程序框架的思考:
觉得MVC模式很适合:
VIEW 层进行: 键盘消息,鼠标消息的接收
CONTROL 层进行: 其进行控制,如:VK_LEFT,VK_RIGHT,VK_ESCAPE的处理.
MODAL 层进行业务逻辑的的处理, 如:VK_RETURN 与鼠标按下,其最终均会调用此
对于注册事件响应机制的思考
在SWE当中,每一个控件其都是注册AddKeyDownEventHandler, AddKeyUpEventHandler.
其是怎么样被触发的呢.
难道只要有键盘按下,被注册了的对象其就可以得到此消息吗.
我反照鼠标消息,AddMouseLeftButtonDown.
当鼠标左键被按下,
被响应的UI 对象必须要满足三个条件:
1. 注册此事件
2.事件反应
3.当UI 对象获得了焦点
注册了键盘消息的UI 对象,其是否也要满足这三个条件呢.
SWE其在进行事件处理的过程当中,不管是鼠标消息还是键盘消息,其是通知用户,此类事件已经发生了,而其要进行什么的事件,则由用户进行处理.
在MFC的BITBLT当中,我们之所以要做很多的事情,是因为这里面没有真正的控件,其均是图片,其是不能接收焦点的.而要由我们分配与管理伪焦点.
[ 在键盘消息处理的过程当中,SWE框架其为我们做了什么事情]
在MFC的BITBLT当中,我们并没有真正的以按键为中心,而接收按键消息,然后经过中间处理过程,之后其就知道要作为于哪一个图片控件,但我们并没有发送到控件当中,而是直接地进行的事件的处理.
在此过程当中,有一些记录状态的变量. 如记录伪焦点是在子菜单当中还是主菜单当中.
在SWE当中, 其将在MFC当中的中间过程,自身来完成处理,用户其只要进行业务逻辑处理就可以了. 其是真正以UI 控件为中心的.
感受
对于键盘操作,没有鼠标操作的方便,所以还要克服太麻烦的心理.
小结:
此文只是一个开始,有很多的不足,但还是:先写代码,然后再重构吧.
感觉:代码没有重用,且不灵活.
回去看看HEAD FIRST 看看有什么好的设计模式,
知道的朋友,麻烦说说.