消息分组,对话窗结构的结合-VIA 复杂消息的传递过程

      以APPSMS
为例,短信所用到的消息加起来近三百多条,如果平均每条消息需要三个函数(某些操作远不止调用三个函数)加起来有九百个函数,管理起来将会是非常的麻烦,也不利于代码重用。
      VIA
用到一种虽然有点费解,但相当便利的方法,对消息进行分组,以一个DialogID为Key来关联相关的窗口资源及与窗口相关的操作。
消息分组:在资源中传递消息的时候,传递的消息的参数也是一个消息,首先跟据主消息(即组消息)找到对应的此组的MessageTabler(由消息映射来处理),然后HandleMessage根据传过来的第二个消息(成员消息)在MessageTable查找得到此消息要执行期的相关参数,如是否要打开窗口,打开窗口的ID,是否要关闭窗口,关闭窗口的ID,要设置数据的窗口ID,和所要执行的操作。
//   
MessageHandler
struct
MessageHandlerT———HandleMessage负责处理()
{
#ifdef
APP_TABLE_CHECK
 uint16 mParam;
#endif
 ControllserCommandOpenT
mCommandOpen;
 uint16
mOpenDialogId;
 ControllserCommandCloseT
mCommandClose;
 uint16
mCloseDialogId;
 uint16
mSetDataDialogId;
 MessageHandlerFuncT
mMessagenHandlerP;
};
HandleMessage处理四个操作:1.如果需要
对特定窗口进行SetData
                                                           
2.
如果需要 执行此消息的特定函数
                                                           
3.
如果需要 打开指定窗口
                                                           
4.
如果需要 关闭指定窗口    
窗口结构:由指定的DialogID关联相关的窗口资源ID及打开窗口时的更新名柄,设置数据的句柄,对按键消息进行反映的句柄组成。 如下面的定义:
//! dialog information
struct
DialogIdInfoT
{
#ifdef
APP_TABLE_CHECK
 int mDialogId;  
//dialog id, to check if a valid object                
#endif
 RESOURCE_ID(DialogResT)
mDialogResId;     //dialog resource id
 bool
mNeedUpdateWhenShow;
  UpdateViewFuncT mUpdateViewFuncP;       
//
由在APP中的OnCreateDialog重载来实现调用 ( Creat Dialog
时首先调用基类默认的Creat,如果派生类中有OnCreateDialog则调用派生类中的)
  SetDataFuncT mSetDataFuncP;    // 由 HandleMessage 中判断
mSetDataDialogId 是否为空,不为空则调用此处的mSetDataFuncP
  HandleWinNotifyFuncT
mHandleWinNotifyFuncP;
      //由在APP中的 HandleWinNotify
重载来实现调用(如SoftKeyBar,MenuCtrl在接收按键消息,如向上向下,确定,取消键时会触发此消息,更具体首先由 APP的
HandleKey(uint32 KeyMsgId, uint32 KeyCode) 来处理消息,处理完后会 调用基类的 Notify 基类调用
派生类的HandleWinNotify)
};
打开窗口时以DialogID为参数,查找该表可以得到相关资源。关健的地方在窗口相关句柄的调用是在哪里。基类帮我们完成了很多很多的事,但是它还会检查它的派生类是否具有某些特定的操作,如基类完成CreateDialog的操作,但如果发现派生类中有OnCreatDialog的定义,则会执行派生类的操作。这就是其中定义的句柄调用的地方,我在上面的定义后写了相关注释。
这样的处理流程也可用于需要大型的软件系统或分布式系统,对消息进行分组然后查表执行相关操作,其中的任一一项操作可以再查表…
如对WCF的调用,可以对消息进行分组,把具体的消息做为组消息的参数进行传递,在服务端进行分解,执行相关的操作。

 

空间被关闭了

收到景安的一封邮件,说我空间超流量,被关闭。这个仅有文字没有任何下载的个人博客,不到半个月竟然流量突破了12G,说出来猪都笑了。不知哪里出的问题,至少也提前通知一声,让我把数据传下来,真是不讲理。下次是绝对不会继续租用景安的空间了。 

私密防火墙与短信预发

      

     我在VIA平台上做的第二个完整的APP,实现了私密防火墙与短信预发的功能。采用MVC的设计模式,基于消息的传递机制。 
     新包的控件与消息的传递处理过程更加复杂,越来越接近MFC。 
     私密防火墙主要实现了对短信,通话记录等窗口的加密。短信预发的实现要麻烦一些,要用到系统的定时器与消息队列。

Trace32调试——VIA平台

 

  1. elf文件的准备
在makefile-hdr中修改编译参数g-为g+,加入调试信息;
# Switches to be
used in Compile
#
——————————
CC_FLAGS =
$(CC_SW_ANSI) $(CC_SW_FPU) $(CC_SW_WARN) $(CC_SW_OPTIMIZE) –g- -fa \
-I"$(subst ;,"
-I",$(subst \,/,$(ARMINC)))" $(CC_SW_EXTRA) \
$(CC_DEFS)
$(CC_INCS) $(CC_MISC)
CCPLUSPLUS_FLAGS =
-embeddedcplusplus -strict $(CC_SW_FPU) $(CC_SW_WARN) $(CC_SW_OPTIMIZE) –g- -fa \
-I"$(subst ;,"
-I",$(subst \,/,$(ARMINC)))" $(CC_SW_EXTRA) \
$(CC_DEFS)
$(CCPLUSPLUS_INCS) $(CC_MISC) -D bool=boolean

app/ UI/ RES 目录中的makefile文件中的 CC_SW_EXTRA = -g-
改为-g+
把build.bat文件中的USE_WATCHDOG=TRUE改为
FALSE,关闭看门狗
Clean之后重新编译,找到D:\software\cp\rom_revc4中的cp.axf文件,备用;
  1. jt文件夹下找到trace脚本:debug-cp-4M.cmm C:\Trace32\jt_D1200P\ debug-cp-4M.cmm
    1. 确定其中axf文件的访问位置:if
      ("&file"=="") &file="../ram_revc2/cp.axf"
      ,并拷贝已有的cp.axf到此目录;
    2. 确定所用cpROM中的起始位置:r.s pc
      0x10000
    3. 确定cp的空间大小:
; Uses on-chip
breakpoints for code in Flash space
map.ro
0x10000–0x003FFFFF
  1. 打开ICD ARM,切换工作目录到对应的jt文件,执行do
    debug-cp-4M.cmm,
    axf文件loadTrace32
  1. 打开ETS
  1. Trace32cpu设置里Down
    变为UP。使下面状态栏显示system
    up.
  1. 设置断点,也可在程序运行中暂停设置,只能设置Onchip类型的断点。
  1. Go运行程序,Break可以暂停,预设断点处会自动停下,可以进行单步调试,查看变量。(更多的调试方法参阅TRACE-ICP使用手册)

 

.NET CF Framework中 控件显示(加载)顺序的问题

         最近在写Iditu相关的代码时,遇到一个不小的问题,一个动态生成的自定义的用户控件会被另一个控件掩盖,即使他们是在不同的屏幕位置。
         尝试了在可视窗口置为最前端,BringToFront(),Control.Parent=this 等处理方式,但似乎都不管用。

         后来发现,跟This.Controls.Add(Control)
的位置有关,在OnPain的时候,先绘制自定义的用户控件然后再This.Controls.Add(ControlB)
另一个控件,这样,ControlB就能不被遮挡可以正常显示了。

 

Iditu PPC V1 -Withmobile

ditu PPC V1.0 版在2009.1.1 会准时与大家见面。

最近在地图的绘制,地图上附加控件的处理,用户相关的操做上做了大量的工作,功能原型己经完成。这个月会完善相关的UI。下个月完善服务端的相关操作。12月份进行联调。到时可能会邀请部用有兴趣的用户进行内测。可以在这里留下你的邮箱,会收到内测的邀请码 🙂
 

Withmobile

withmobile是一个大的项目,其宗旨在网站上有说明.Iditu是她的一个应用,关于地图方面的.

现在透露一点:

1.你在Iditu注册扣可以把你的位置信息更新到服务器,你可以添加好友,把她加入到你所在的组中.

2.在地图上你就可以看到你和你的朋友的具体的位置信息.

目前还在封闭开发当中,希望不久能给大家一个测试版使用.
 

阿拉伯输入法

最近遇到比较头痛的一件事,要实现阿拉伯输入法,输入法本身就是一项很困难的事,更何况是阿拉伯那些窗形文字,是从右向左显示的,晕了,并且要在短时间内完成.Withmobile的工作也进入比较棘手的地方.不过会给大家带来惊喜的:)