按键对应

2009-9-29

1.触摸屏事件与键盘事件是如何对应的(即为什么按触摸屏的1和键盘的1会有同样的效果)

键盘的事件种类及注册函数:

 

触摸屏的事件种类及注册函数:

 

非手写模式注册函数:

       mmi_pen_register_down_handler(mmi_pen_hdlr  pen_fp)

    mmi_pen_register_up_handler(mmi_pen_hdlr  pen_fp);

    mmi_pen_register_move_handler(mmi_pen_hdlr  pen_fp);

    mmi_pen_register_repeat_handler(mmi_pen_hdlr  pen_fp);

    mmi_pen_register_long_tap_handler(mmi_pen_hdlr  pen_fp);

手写模式注册函数:

    mmi_pen_register_stroke_down_handler(mmi_pen_hdlr pen_fp)

       mmi_pen_register_stroke_up_handler(mmi_pen_hdlr pen_fp)

       mmi_pen_register_stroke_move_handler(void(* begin_fp)(void), void(* end_fp)(void), mmi_pen_hdlr pen_fp)

   。。。。。

 

触摸屏与键盘的很大区别是:一般触摸屏需要判断Pen的位置,才能产生相应的动作,所以pen_fp中有相当一部分代码是在判断位置,如AudPly模块的函数mmi_pen_check_inside_polygonCalc模块的函数gui_calculator_translate_pen_position

而键盘则相对简单,只需在注册时写明键盘码即可,不需要代码判断按在哪个键上

 

 

计算器添加键盘操作符响应的过程:

背景--------35上触摸屏处理完全正确,键盘支持数字键、pound键、del键,不支持操作符

基本思路-----参照数字键的触摸屏和键盘,添加操作符的键盘支持

计算器中数字键的注册位置在函数CalcRegisterKeyHandler中:

    register_MMI_key_input_handler();

    register_key_down_handler(CalcHandleNumKey);

这两句共同完成了数字键的响应,函数都定义在wgui.c,下面分析这两个函数

register_MMI_key_input_handler()

 

SetKeyHandler(MMI_key_1_down, KEY_1, KEY_EVENT_DOWN);

SetKeyHandler(MMI_key_1_down, KEY_1, KEY_REPEAT);

SetKeyHandler(MMI_key_1_up, KEY_0, KEY_EVENT_UP);

            currKeyFuncPtrs[keyCode][keyType] = funcPtr;

MMI_key_1_down

MMI_key_input_handler(KEY_1, KEY_EVENT_DOWN);

 

 MMI_key_down_handler_function(key_code);

 

 

 

register_key_down_handler的定义如下

void register_key_down_handler(void (*f) (MMI_key_code_type key_code))

{

  MMI_key_down_handler_function = f;

}

关键就是这里了,两个函数的交接点是函数指针MMI_key_down_handler_function,即register_MMI_key_input_handler()要调用此函数指针指向的函数,而    register_key_down_handler()则是对此函数指针赋值!

MTKdevelper提供的这两个函数很有用,简单来说register_MMI_key_input_handler注册了所有数字键的所有事件响应,register_key_down_handler(void (*f) (MMI_key_code_type key_code))提供了Down事件的响应函数注册入口,developer只需在自己的函数中定义用户的处理,将函数名传入即可。

所以通过register_key_down_handler(CalcHandleNumKey)就使MMI_key_down_handler_function指向函数CalcHandleNumKey

 

下面是按下数字键2的断点分析,

 

 

按下key_2,产生down事件,执行ExecuteCurrKeyHandler,在其中通过currKeyFuncPtrs[keyCode][keyType] = funcPtr;找到响应函数MMI_key_2_downentry时通过  register_MMI_key_input_handler()注册),然后顺序执行下去,当执行到MMI_key_input_handler(KEY_1, KEY_EVENT_DOWN)

 MMI_key_down_handler_function(key_code)时,就跳到了CalcHandleNumKeyentry时通过   register_key_down_handler(CalcHandleNumKey)赋值),结果就如图了。如果没有上面对两个注册函数的分析,就会对这里的执行很迷惑,因为断点调试是程序运行时调试,函数的注册在entry时已经完成了!

 

 

 

 

 

CalcHandleHiliteOperator()分析

g_calc_cntx

OpToExecute  上一次的的操作符  初始化时为CALC_OP_NONE

Operator      当前输入的操作符  初始化时为CALC_OP_NONE

 

CurrHilite

 

PreOperator = g_calc_cntx->Operator;

g_calc_cntx->Operator = g_calc_cntx->CurrHilite;

g_calc_cntx->OpToExecute = PreOperator

 

输入数字时保存到buff2中(以ASCII码保存,buff2是字符数组)

通过函数CalcGetPreOperand()转化成float型并存储到g_calc_cntx->Operand2

 

每输入操作符,此函数最后把buff2拷到buff1, Operand2Len拷到Operand1Len, Operand20Operand2Len = CALC_ZERO_LENOperand2Buf[0] = CALC_SYM_NULL

 

 

 

g_calc_cntx->ExecFlag当按下=后再按下poundKey或者numKey,都会清掉计算器的全部值,开始新的计算,此成员就是用来作此判断的,

初始化false ,当按下=后置为true(即just after execution,刚刚完成),按下操作符置为false

 

g_calc_cntx->CurrHilite

初始化CALC_OP_EQUAL

 

g_calc_cntx的初始化

       在函数CalcPreEntryApp initialize image+ CalcResetContext()

 

CalcComputeResult在按左软件或触摸=时才调用

 

 

 

函数间的关系:

1.三个reset函数

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值