📄 《深入brew开发》——第八章 brew的事件处理 - gemsea的专栏 - csdnblog.htm
字号:
<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>9</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_9</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>*</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_STAR</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>#</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_POUND </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>清除键(返回键)</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_CLR</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>上方向键</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_UP</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>下方向键</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_DOWN</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>左方向键</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_LEFT </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>右方向键</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_RIGHT</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>选择键(确认键)</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_SELECT</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>呼叫键</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_SEND</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>结束键(关机键)</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_END </DIV></TD></TR></TBODY></TABLE>
<DIV><SPAN>
</SPAN>通过上面的表格我们可以发现,与其他系统相比BREW缺少了一些独立的字符按键。这是因为通常一个BREW设备都是只有一个数字键盘和少数的几个控制按键,而字符的输入则是通过文件控件来完成。文本控件通过用户输入方式和所选择的不同输入法,如数字、字母以及拼音或笔画等,来实现对应的文本输入。事实上,要做到这些我们需要将应用程序捕获到的用户输入事件传入文本事件中去,传入的方式是通过文本控件的HandlEvent方法。</DIV>
<DIV><SPAN>
</SPAN>在我们的应用程序中通常使用控件来处理一些用户的输入事件,而且在应用程序中通过控件的HandleEvent函数将这些事件传入,而控件在处理了相关事件之后,也同样会以某种方式来保存结果或者通知应用程序。例如,文本控件会保存并显示用户输入的文本,而菜单控件则会通过发送EVT_COMMAND事件来告知应用程序用户的选择项目是什么。在后面的章节中我们将逐渐的看到这些应用。</DIV>
<DIV><SPAN>
</SPAN>有一个特殊的按键事件需要我们特别的注意,这个事件就是带有AVK_CLR参数的EVT_KEY事件。在默认情况下,当BREW内核捕获到这个事件的时候所执行的动作是关闭当前的应用程序。因此,如果我们不想BREW在收到这个事件的时候关闭我们的应用程序的话,我们需要在应用程序中处理这个事件,也就是在我们的应用程序接收到这个事件的时候返回TRUE,以使得BREW内核不会再处理这个事件。</DIV>
<DIV><STRONG><FONT size=4><A name=_Toc135208663>8.2
</A><SPAN>构建应用程序框架</SPAN></FONT></STRONG></DIV>
<DIV><SPAN>
</SPAN>由于在每一个BREW应用程序中很多事件的处理方式都基本相似,因此,如果我们可以把这些基本的事件处理采用统一的方式来处理,那么将极大地降低我们构建新应用程序的工作量。在这一部分中,我们将来构建这样的一个应用程序框架,在这个框架中可以自动处理诸如EVT_APP_START和EVT_APP_SUSPEND等事件。</DIV>
<DIV><SPAN>
</SPAN>在本章中,这个应用程序框架将从一个叫做文件浏览器的应用程序中进行构建。在这个程序中,所实现的功能就是将BREW
Shared文件夹下面的文件枚举出来,选中相应的文件后可以显示文件的基本信息,如大小等。</DIV>
<DIV><STRONG><FONT size=3>8.2.1创建文件浏览器应用程序</FONT></STRONG></DIV>
<DIV><SPAN>
</SPAN>由于我们现在才开始构建第一个真正包含了一定功能的应用程序,因此,在这里将一步一步的讲解如何构建这个应用程序。同时,还可以参考上面一章里面关于创建应用程序的步骤说明,在后面的示例中我们将省略构建应用程序的步骤。好,我们现在打开MicroSoft
Visual Studio .Net2003,选择新建项目后如下图:</DIV>
<DIV align=center><IMG alt=""
src="《深入BREW开发》——第八章 BREW的事件处理 - Gemsea的专栏 - CSDNBlog.files/9173d13c6ae8416fa0b7696a11d903a8.png"></DIV>
<DIV align=center>图8.1 生成FileExplorer应用程序</DIV>
<DIV
style="TEXT-INDENT: 21pt">选择BREW向导,输入项目名称为FileExplorer。如果现在您看不到这个BREW向导的话,说明还没有安装BREW
Addins。这个插件现在包含在BREW SDK
Tools中,和MIFEditor和ResourceEditor一起。我们可以从高通网站上下载并安装BREW SDK
Tools应用程序。</DIV>
<DIV
style="TEXT-INDENT: 21pt">确定后出现如图8.2所示的下对话框,其中我们要选上File,因为我们的应用程序中将使用文件处理的接口。然后我们选择Options选项,看到如图8.3种所示,在是否输出注释的部分选择“No”,因为这些注释将会占领很大的文档篇幅。然后选择MIF
Editor按钮,建立此应用程序的模块信息文件,打开MIF
Editor应用程序。如图8.4种所示一样。最后,点击“Finish”,建立应用程序。</DIV>
<DIV style="TEXT-INDENT: 21pt">在MIF文件编辑器的Applets选项卡中,我们选择“List of Applets
defined in this module”中的增加Applet按钮,显示如图8.5所示。我们选择从本地生成Class ID,并输入Class
ID的值为0x99999999,输入Applet的名称为FileExplorer,然后点击确定,保存生成.bid文件。这样,一个Applet就加入到一个模块中去了。</DIV>
<DIV align=center><IMG alt=""
src="《深入BREW开发》——第八章 BREW的事件处理 - Gemsea的专栏 - CSDNBlog.files/86091ad98fb0435bbe0d64e39d43512a.png"></DIV>
<DIV align=center>图8.2 设置FileExplorer应用程序的包含头文件</DIV>
<DIV align=center> </DIV>
<DIV><IMG alt=""
src="《深入BREW开发》——第八章 BREW的事件处理 - Gemsea的专栏 - CSDNBlog.files/1f0633a5dcd043f68a12ce8772df0e31.png"></DIV>
<DIV align=center>图8.3 设置FileExplorer应用程序的选项</DIV>
<DIV> </DIV>
<DIV align=center><IMG alt=""
src="《深入BREW开发》——第八章 BREW的事件处理 - Gemsea的专栏 - CSDNBlog.files/84b4630ae2124f6b81b1f2fcd6a2b89d.png"></DIV>
<DIV align=center>图8.4 MIF Editor</DIV>
<DIV align=center><IMG alt=""
src="《深入BREW开发》——第八章 BREW的事件处理 - Gemsea的专栏 - CSDNBlog.files/5b77b0dbc59d44d2a8fd9e996f9e8576.png"></DIV>
<DIV align=center>图8.5 在模块中增加Applet</DIV>
<DIV><SPAN>
</SPAN>增加完Applet之后,还需要到Privileges中增加File的访问权限,否则在我们的应用程序中将不能使用文件系统的接口。最后保存生成的文件为FileExplorer.mfx文件,同时,选择build菜单,生成mif文件。</DIV>
<DIV><SPAN>
</SPAN>至此,一个由向导生成的FileExplorer应用程序就声称完毕了,我们接下来要做的就是在这块“白纸”上勾勒出我们的应用程序框架。</DIV>
<DIV><STRONG><FONT
size=3><SPAN>8.2.2</SPAN><SPAN>使用状态表示应用程序</SPAN></FONT></STRONG></DIV>
<DIV><SPAN>
</SPAN>如果我们写一个应用程序只需要几百行的代码的话,那么这个世界对于程序员来说简直是太美妙了。但是,这仅仅是一个愿望,因为实际的程序代码通常需要成千上万行。就算是用BREW这样高度集成的平台来开发一个稍微复杂的应用程序,都需要上万行的代码才能完成。而且对于程序员来说,每增加一行代码,就相当于打开了一个潘多拉盒子,不知道这一行将来会带来什么样的后果,这种情况在代码较多的时候尤为明显。把这个潘多拉的盒子关上是所有程序员一直的的梦想,于是,各种各样的程序结构诞生了,函数分割、文件分割、以及状态分割等形式相继出现了,又于是C语言出现了、C++语言出现了、可视化编程出现了。这些都是程序员们为了关闭这个潘多拉盒子所做的努力,事实证明这些努力没有白费。这些编程语言以及对应的代码组织方式极大的方便的程序的管理,使得开发大型程序不再那么复杂了。</DIV>
<DIV
style="TEXT-INDENT: 21pt">当然,凡事总有穷尽,无论怎样的努力,程序中间总会有缺陷。或者这是人类思维方式的一种缺陷,或者受限于编程者的水平,这个潘多拉盒子还是时常会打开。“当我们改变不了环境的时候就改变我们自己吧”,对于程序缺陷,既然我们无法避免那就容忍它的存在吧!我们唯一能够做的就是尽可能的减少它们的存在。</DIV>
<DIV><SPAN>
</SPAN>编写简单的程序可以在很大程度上减少程序的缺陷,而让程序变得简单的方法就是将程序都分割成一小块一小块的,然后通过某种方式将这些小块的程序连接起来,共同构成一个大型的应用程序。一种较好的方式就是我们将要介绍的状态机,我们可以把应用程序分割成不同的状态。例如,在HelloWorld应用程序中,显示“Hello
World”的界面就可以看成一个显示字符串的状态。为了在BREW应用程序开发的过程中能够拥有更加清晰的程序流程,我们特意设计了这样的一个状态机的应用程序框架。</DIV>
<DIV><SPAN>
</SPAN>我们的基本思路是这样的,划分应用程序状态的方法是每一个显示界面都作为一个状态,在进入状态的时候创建界面,同时状态机停止运转,此时等待用户在当前的界面进行操作,用户操作完成后关闭当前的界面,并启动状态机继续运行。由于BREW的每一个应用程序都是通过HandleEvent方法来获得事件的,在每一个界面等待用户输入的时候,每一个界面都对应一个界面的HandleEvent函数,用来捕获用户在这个界面的输入。这样,我们的应用程序将被分成状态和界面两种单元。</DIV>
<DIV><IMG alt=""
src="《深入BREW开发》——第八章 BREW的事件处理 - Gemsea的专栏 - CSDNBlog.files/8ea45cb902fd41b989b9a9e474507322.gif"></DIV>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -