⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 《深入brew开发》——第八章 brew的事件处理 - gemsea的专栏 - csdnblog.htm

📁 《深入BREW开发》——第七章 创建新的BREW应用程序
💻 HTM
📖 第 1 页 / 共 5 页
字号:
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在这一章里面,我们将详细的剖析一下BREW的事件处理的方式,以及我们的应用程序是如何捕获(Handle)和处理它们的。同时,根据这种方式的特点我们还将构建一个状态机的应用程序框架,而且这个框架将有利于我们今后应用程序的开发。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc135208659>8.1 
      </A><SPAN>理解事件驱动模型</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>做为BREW平台最为核心的一块,BREW的事件驱动模型是我们开发BREW应用程序必须要提前理解和消化的。这也是我们开发应用程序的基本的一步。</DIV>
      <DIV><STRONG><FONT 
      size=3><SPAN>8.1.1</SPAN><SPAN>处理一个事件</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>对于一个BREW应用程序来说,不管愿不愿意处理这个事件,都将收到来自系统或使用者的事件,并且将这些事件传递到应用程序中的控件或者接口当中。正如前面章节所描述的一样,BREW通过应用程序的HandleEvent函数将事件传递给应用程序,应用程序处理这些事件并且通过函数的返回值告知系统这个事件的处理情况。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">与大多数的操作系统不同,我们的应用程序不需要采用的轮询的方式来查看是否有事件传递过来,BREW系统将会根据相关的事件主动的调用应用程序的HandleEvent函数将事件传递给我们的应用程序。这个区别是至关重要的,因为我们的应用程序在捕获一个事件的时候,必须进行尽可能简单的处理。不像一些大型的操作系统平台,如Windows 
      CE和其他的嵌入式系统操作系统,BREW运行在一个单线程的环境,因此,我们必须尽可能快地处理每一个事件,这样才不至于影响系统的正常运行。否则,应用程序的表象可能就会是响应用户非常迟钝,这样的应用程序是用户不会喜欢的。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>基于这样的一个 BREW 
      事件驱动环境,要求我们的应用程序及时处理事件。这意味着应用程序应该迅速处理事件并立即返回。BREW将事件传递给应用程序时,应用程序会通过返回TRUE(表示已处理)或FALSE(表示未处理)来指示应用程序是否已处理事件。如果小程序必须将事件传递给其它事件处理程序(如控件或接口),它只需返回调用这个接口HandleEvent函数的结果。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">BREW应用程序的事件处理(HandleEvent)函数接受三种与事件相关参数的输入,它们分别作为HandleEvent函数的第二、第三和第四个参数传递。下面是一个事件处理程序函数的示例:</DIV>
      <TABLE 
      style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" 
      cellSpacing=0 cellPadding=0 border=1>
        <TBODY>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=568>
            <DIV>boolean HandleEvent(MyApp* pMe, AEEEvent eCode, uint16 wParam, 
            uint32 dwParam);</DIV></TD></TR></TBODY></TABLE>
      <DIV 
      style="TEXT-INDENT: 21pt">第二个参数为AEEEvent类型,用于指定应用程序接收的主要事件。第三个和第四个参数是根据接收事件来定义的短数据和长数据。 
      这些值取决于事件本身,并根据事件的定义来定义。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">典型的,我们的应用程序的事件处理函数是一个巨大的switch语句的程序结构,在这个结构中我们可以看到我们所感兴趣的事件,或者直接将某些事件传递到一些二级事件处理函数之中,这些二级事件处理函数既可以是我们为了程序结构的清晰而编写的函数,也可以是某个控件或接口的事件处理函数。关于这个switch语句的结构,我们可以在上一章创建的应用程序中看到。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">执行应用程序时,我们只需考虑和处理应用程序可能需要处理的事件。一般情况下,我们可以忽略很多事件。例如,如果应用程序执行一个只需使用上下左右箭头键作为输入的游戏,并收到与0-9按键对应的事件,那么它将返回FALSE来表示应用程序不处理这些事件。体现在代码上就是我们的switch语句中不必“case”这些事件。</DIV>
      <DIV><STRONG><FONT 
      size=3><SPAN>8.1.2</SPAN><SPAN>捕获系统事件</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在我们的应用程序当中,最起码需要处理EVT_APP_START、EVT_APP_STOP、EVT_APP_SUSPEND和EVT_APP_SUSPEND事件,上一章里面我们已经了解了它们的作用。而除了这些事件之外,应用程序中还可能涉及到的系统事件有:</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      1</SPAN>、EVT_APP_MESSAGE事件。此事件表示当前系统发送了一个文本短消息到我们的应用程序中。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      2</SPAN>、EVT_ALARM事件。此事件表示系统发送了一个闹钟事件到我们的应用程序之中。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      3</SPAN>、EVT_NOTIFY事件。此事件表示有一个系统的通知事件到达。发送通知事件的通常包括呼叫等事件。我们的应用程序需要注册相应的通知事件才能接收到这些通知。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">这些系统事件是属于BREW的系统级别的事件,无论当前我们的应用程序处在什么样的状态下,都会处理这些系统事件。也就是说即便当前我们的应用程序处于关闭状态,也同样的可以接收到这些系统事件。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">我们还可以定义大于EVT_USER的事件代码,通过ISHELL_PostEvent接口来向特定的应用程序发送自定义事件。例如:</DIV>
      <TABLE 
      style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" 
      cellSpacing=0 cellPadding=0 border=1>
        <TBODY>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=568>
            <DIV style="TEXT-INDENT: 21pt">bRet = ISHELL_PostEvent( pIShell, 
            classid, eCode, wParam, dwParam );</DIV></TD></TR></TBODY></TABLE>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>其中pIShell是IShell接口的指针,classid表示事件发送到哪一个应用程序,eCode就是我们要发送的事件。通过这样的方式,就像系统事件一样,无论目标应用处于什么样的状态,都可以收到这个事件进行处理。bRet代表事件是否发送成功,注意,这里面返回值代表的是事件是否发送成功,而不是事件的处理结果。</DIV>
      <DIV><STRONG><FONT 
      size=3><SPAN>8.1.3</SPAN><SPAN>捕获用户接口事件</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在我们的应用程序中处理的大多数事件是键盘事件或者菜单选择事件,这些事件的特点是只有在应用程序处于活动状态的时候才能处理,这些事件就是典型的用户接口事件。这些事件的处理也是我们应用程序的核心内容,因为这些事件描述了当前用户的输入信息。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>最简单的用户输入就是用户按一下按键,然后释放按键。这其中BREW当前活动的应用程序将收到三个事件:EVT_KEY_PRESS、EVT_KEY和EVT_KEY_RELEASE。EVT_KEY_PRESS描述用户已经按下了一个按键,EVT_KEY_RELEASE表示用户已经释放了这个按键,EVT_KEY则是介于两者之间的一种按键装态的描述。通常情况下我们的应用程序只需要处理EVT_KEY事件就好了。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>对于每一个按键事件,系统通常使用一个16位的按键代码来表示当前按下的是哪一个按键。这些按键代码定义在AEEVCode.h中,最为常用的按键代码如下:</DIV>
      <TABLE 
      style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" 
      cellSpacing=0 cellPadding=0 border=1>
        <TBODY>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>按键</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>按键代码</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>0</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_0</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>1</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_1</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>2</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_2</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>3</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_3</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>4</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_4</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>5</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_5</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>6</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_6</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>7</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_7</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>8</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=284>
            <DIV>AVK_8</DIV></TD></TR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -