VIA Selle SMS 系列之—设置篇

Sms的相关设置问题曾经有过介绍,比较简略,这次以在编写短信过程中设置发送属性的过程,再来讨论下SMS中复杂消息的处理过程,示例的操作步骤如下:
Message—>Write
Message—>Options—>Sending options[A]—>(Mark
One)[B]—>Done[C]
这里主要说的是从A到C的过程。
A.在Options菜单中选择Sending
Options的选项:
触发消息:
MessageID APPMSG_SMS_NEWMSG
      Parameters:APPMSG_SMS_PARAM_NEWMSG_OPTION_SENDING_OPTION
 响应消息:
    case APPMSG_SMS_NEWMSG:
      return
HandleMessage(
SmsMessageHandlerNewmsgTable, MsgId, Param1,
               APPMSG_SMS_PARAM_NEWMSG_MAX);
由“APPMSG_SMS_NEWMSG”这条消息,会继续查找一个表,这个表中有相对于触发消息所带参数的具体动作。
const SmsMessageHandlerT SmsMessageHandlerNewmsgTable[] =
{
 { //APPMSG_SMS_PARAM_NEWMSG_OPTION_SENDING_OPTION
   
APPSMS_TABLE_ITEM(
APPMSG_SMS_PARAM_NEWMSG_OPTION_SENDING_OPTION)// 这条消息告诉我们要
   
SMS_CONTROLLER_COMMAND_OPEN_DIALOG,
//  
打开一个Dialog
    APPSMS_DIALOGID_NEWMSG_OPTIONS_SENDING_OPTIONS, //   所打开的DialogID
   
SMS_CONTROLLER_COMMAND_CLOSE_DIALOG,
//  
关闭一个Dialog
   
APPSMS_DIALOGID_NEWMSG_OPTIONS_MENU,
// 所关闭DialogID
   
APPSMS_DIALOGID_NULL,
// 要运行Dialog定义里的SetDataDialogID ,此时为空
   
&SmsControllerC::HandleNewMsgOptionSendingOption
// 执行触发消息的额外函数
 },
}
总的来说,在Options菜单中选择Sending
Options选项,会打开一个Dialog,关闭此Options的Dialog,并执行一个函数,设置此编缉短信的Sending
Options的始初化状态,即从SmsEditMsgManagerC中具体的短信对象的状态来设置SmsEditMsgManagerC当中的几个表示状态的临时变量。
B.在打开Options的Dialog时所执行的动作:
//dialog information table
const SmsDialogIdInfoT
SmsDialogIdInfoTable[] =
{
 {
   APPSMS_TABLE_ITEM(APPSMS_DIALOGID_NEWMSG_OPTIONS_SENDING_OPTIONS)
  
IDD_DLG_SMS_NEWMSG_OPTIONS_SENDING_OPTIONS,
   FALSE,
  
&SmsViewC::UpdateViewNewMsgOptionSendingOption,
 // 打开此Dialog后,更新此Dialog视图的函数,立即执行
  
&SmsViewC::SetDataNewMsgOptionSendingOption,
// 针对此Dialog的设置数据的函数,非立即执行,由其它函数调用
  
&SmsViewC::HandleWinNotifyCheckBoxMenuSettingDlg
// 处理Dialog中控件发生变化时的响应函数,当控件状态变化时调用此函数
 },
}
在更新视图的函数中,会根据之前的设置项(SmsEditMsgManagerC中临时的成员变量)(在上面的执行触发消息的额外函数中初始化的状态),来改变Dialog的显示内容。
当前Sending
Options里的Dialog中有两项,改变是否选中的状态,就会调用“HandleWinNotifyCheckBoxMenuSettingDlg”并在UI上显示变化,即选中,没选中,SoftKeyBar显示发生变化,即标记,未标记
C.改变完状态后,按“Done”所执行的动作:
触发消息:
          MessageID
:APPMSG_SMS_NEWMSG
         
Parameters
APPMSG_SMS_PARAM_NEWMSG_OPTION_SENDING_OPTION_DONE
 响应消息:
case APPMSG_SMS_NEWMSG:
      return
HandleMessage(
SmsMessageHandlerNewmsgTable, MsgId, Param1,
               APPMSG_SMS_PARAM_NEWMSG_MAX);
同第一步的过程,但这里的参数不一样,对应的MessageHandlerTable有变化:
 { //APPMSG_SMS_PARAM_NEWMSG_OPTION_SENDING_OPTION_DONE
   
APPSMS_TABLE_ITEM(
APPMSG_SMS_PARAM_NEWMSG_OPTION_SENDING_OPTION_DONE)
// 这条消息告诉我们要
   
SMS_CONTROLLER_COMMAND_OPEN_POPUP,
//  
打开一个Pop
up
的窗口
   
APPSMS_DIALOGID_POPUP_SETTINGS_SAVED,
//  
所打开的Pop
up
窗口的ID
   
SMS_CONTROLLER_COMMAND_CLOSE_DIALOG,
//  
关闭一个Dialog
   
APPSMS_DIALOGID_NEWMSG_OPTIONS_SENDING_OPTIONS,
// 所关闭DialogID
   
APPSMS_DIALOGID_NEWMSG_OPTIONS_SENDING_OPTIONS,
// 运行此Dialog定义里的SetData函数    &SmsControllerC::HandleNewMsgOptionSendingOptionDone// 执行触发消息的额外函数
 }
即按“Done”后,关闭此Sending
Options的窗口,打开一个Pop UP的窗口,提示改变成功,然后调用Sending Options的窗口的SetData函数,最后再执行触发消息的额外函数。
 1.
SetData函数:把用户对选项的选择内容保存临时的变量当中
 2. 额外函数:执行具体的保存动作,即把临时变量当中的内容保存到当前所编辑短信的具体对象当中
最后返回短信内容的编辑界面,完成设置动作。
补充一点:
SmsEditMsgManagerC中的短信对象即mEditMsg,并不是在其构造函数中就初始化的,而是在SetEditMsgText时进行初始化,并且读取当前对短信选项的总体设置来初始此单条短信。
bool
SmsEditMsgManagerC::SetEditMsgText(const StringC &StrText)
{
 EnableEditMsg();// 从短信的总体选项设置来初始化此条短信
 mEditMsg.SetUserData(StrText);
 return TRUE;
}
编写新短信时,这个动作是在SmsViewC::SetDataNewMsg(DialogC *DlgP, uint32 MsgId, uint32
Param)里执行的,在Edit Message新建短信窗口按Send键,或Options键都可触发此消息.
 

再补充一点:
       针对类型为
MENU_LIST_CHECKBOX 的MENU风格,当按下时会改变选中状态,此时会立即收到HandleWinNotify消息,SoftKeyBar中间键的自定义消息将不起作用(当系统判断为Checkbox时SoftKeyBar的中间键消息被拦截,默认为选择CheckBox的消息)。
        针对类型为
MENU_LIST_RADIOBOX 的MENU风格,当按下时不改变选中状态,此时不会收到HandleWinNotify消息,SoftKeyBar中定义的消息将会起作用。
可在以UPdateDialogView时,设置一个属性使在MenuItem项中滚动时,可以触发HandleWindNotify消息。
     MenuP->SetNotifyScrollEvent(TRUE);
一个Dialog中,若即有MenuItem项对应的消息,又有此Dialog的SoftKeyBar对应的消息。
若SoftKeyBar的消息不为:WINMSG_SOFT_SELECT_KEY则,以SoftKeyBar中的消息为准执行,而不会执行MenuItem对应的消息。
若SoftKeyBar的消息为:WINMSG_SOFT_SELECT_KEY则实际会执行MenuItem对应的消息。
若SoftKeyBar的消息为空:则什么都不会执行。
有CheckBox的时候按键消息的传递过程:
按下Dialog中包含CheckBox的SoftKeyBar中的按键后的处理过程:
                
1.
当前APP的HandleKey //如果直接返回则按键消息将不会被执行
                 2.
ApplicationC::HandleKey //所有APP的基类按键消息
                 3.
接着消息传递如下(略)
MailClientC::SendMail
MailServerC::SendMail
MailServerC::DispatchMail
WinManagerC::ProcessMail
WindowC::ProcessMail
MailClientC::ProcessMail
MailClientC::MailMapProc
                 4.
DialogC::OnKeyPress //will let dialog’s child control handle key press
first
                 5.
DialogC::PreOnKey //will get the right child to handle the key
message
6.接着消息传递如下(略)
WindowC::ProcessMail
MailClientC::ProcessMail
MailClientC::MailMapProc
    
7.
MenuCtrlC::OnKeyPress // 如果的这里返回则按键消息也不会被执行,CheckBox则在这里Return True;不继续往下处理消息,所以自定义的SoftKeyBar消息将不会被执行,在这里返回
    
8.
MenuCtrlC::CheckItem   //change the check box
status
9.MenuCtrlC::SendNotify //触发CheckBoxHandlWinNotify消息
                   
……
再之后没有继续跟下去,应该是把定义的按键消息发送到Task进行分发处理的操作。
总之,短信方面的处理比较复杂,也是出问题比较集中的地方。

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.