第二部分 – 在模拟器上运行“Hello BREW”
在跟随本文学习相关知识点之前,你需要以下环境:
1. Microsoft Visual C++ 6.0®(或更高版本)
2. 1.1版的BREW SDK.
要了解系统最低要求,和获得更细节的资料,SDK的安装指导,请查看SDK 1.1的README文件。注意,在这里我假设你已经读过了本系列中之前的一篇文章,“什么是BREW”以及本系列的前一篇文章“第一部分-预备知识”。我进一步假设你已经创建了一个模块信息文件(helloBREW.mif)和一个BREWx小程序资源文件(helloBREW.bar)并且分别将他们拷贝到了“...yourBREWdir\Examples\mif\256Color\”和“...yourBREWdir\Examples\en\256Color\”两个目录。同时,在“...yourBREWdir\Examples\helloBREW\”目录必须有用BREW资源编辑器生成的helloBREW_res.h文件,用BREW应用程序向导创建的应用程序源文件(helloBREW.c)。如果你需要了解更多,可以阅读上面提到的第一部分,或者阅读SDK附带的文档。
在这个例程中,你需要知道文件名是非常重要的。特别的,应用程序目录和模块信息文件(.mif)必须目标.dll文件名字相同(也就是前缀相同)。注意,你可以通过打开项目设置对话框(选择项目菜单>设置)的Link选项卡来定义.dll文件的名字。如果你按照第一部分的去做了,应该在相应目录已经有了正确命名的文件。
最后,提醒一下,在本文中“小程序”和“应用程序”这两个词会交替使用,都代表同一事物。
图7
如图7所示,helloBREWHandleEvent()中对BREW应用程序向导生成的初始代码有大量修改。在最上面,我们定义了一个指向我们的小程序数据结构的指针,并且将本函数的第一个参数,IApplet *分配给这个指针。整个事件句柄中,这个指针被用于访问helloBREW中AEEApplet部分的m_pIShell成员,此外还提供对我们用来代表IStatic控制器的m_pIStat指针的访问。
在EVT_APP_START的开头,我们定义的第一个本地变量是AEEDeviceInfo类型变量。这个结构包括了保存设备屏幕尺寸和颜色深度的成员变量。更详细的数据成员介绍可以在BREW API参考最后的数据结构(数据类型,译者注)章节中找到。记得我提醒过关于尽量减少堆栈空间的使用,我们应该在堆上为这个结构分配内存,并且在本地定义指针来监视它。由于这个小程序不需要担心堆栈空间耗尽的危险,为了简单的缘故,我将这个结构定义为本地变量。
接下来,我们看到一个简单的矩形对象(AEERect),我们用来确定静态控制器的大小和位置,并且确定几个缓存分别保存m_pIStat的标题和文本。AECHAR是uint16的类型定义(typedef)(参考AEE.h),而uint16又是无符号短整数的类型定义(参考AEEComdef.h)。这样AECHAR可被用来存放Unicode或者成为宽字符集(wide characters)类型变量。这样wbufTtl和wbufTxt指向的是由宽字符集中的字符组成的以空结尾的字符串。参考BREW API参考中的Helper函数章节,了解操纵宽字符集字符串的工具。
在验证完m_pIShell的有效性后,我们可以调用来给di赋值。接下来,屏幕的尺寸成员di.cxScreen和di.cyScreen被用于设置装有静态控制器的位置、尺寸的矩形对象。在屏幕坐标系统中,原点是显示器的左上角,而当我们向右移时x坐标增大,向下移时y坐标增大。
在调用ISHELL_CreateInstance()时指定AEECLSID_STATIC为请求接口的class ID。假设成功,这个函数调用返回时m_pIStat将指向一个有效的IStatic。其它接口的class ID可以在aeeclassids.h中找到。在创建了IStatic后,我们调用ISTATIC_SetRect()来设置它的矩形,将指向刚才初始化的矩形结构的指针传递给他。
在为之前定义的缓冲区(wbufTtl,wbufTxt)分配了内存后,我们调用ISHELL_LoadResString()两次:一次是为IStatic的标题,一次是文本。这两个缓冲区则将标题和文本提交给ISTATIC_SetText()。ISTATIC_SetProperties()用于定义标题和文本的位置,并且调用ISTATIC_Redraw()在屏幕上显示静态控制器。参考BREW API参考中的IStatic章节可以了解更多关于这些函数的调用方法。
注意BREW不能容忍内存泄漏。因此你需要确信所有对MALLOC()的调用都相对应的有对FREE()的调用,而对ISHELL_CreateInstance()的调用相对应的有对I*_Release()的调用。在EVT_APP_START的最下面释放(FREE())了使用到的两个缓冲(buffer)。HelloBREW在hb_FreeAppData()中调用Istatic_Release()时释放Istatic实例。
图8
图8显示helloBREWHandleEvent()的剩余部分。这里我们增加了一个EVT_KEY事件,用于应用手机上“CLR”按键的标准。当“CLR”按钮按下时,我们通过返回FALSE来通知AEE应该关闭应用程序了。在手机上“CLR”按键预置的意思为“退回上一级”,你的应用程序应该实现这个动作。
因为释放m_pIStat的事情交由hb_FreeAppData()处理,因此我们在EVT_APP_STOP事件句柄中不需要做任何事情。
图9
图10
现在来启动BREW模拟器(Emulator),可以通过点击BREW SDK程序组中的快捷方式,也可以点击Visual C++里画有红色惊叹号的按钮来启动模拟器。
点击BREW SDK程序组中的快捷方式,或者点击Visual C++中的红色惊叹号来启动BREW模拟器。用左右方向键在BREW应用程序管理器中定位helloBREW,选中后,你可以看到在模拟器屏幕的正中显示了我们所作的85×40的大图。在键盘上按回车,模拟器的显示器上将显示如图10中第二帧的图像。
由于我为helloBREW.mif另外定义了一个MIF的目录,所以你的模拟器显示的第一帧可能不会象上图10中显示的一样。我这么做的目的是避免在一大堆SDK中自带的实例应用的图标中去找helloBREW的图标。也就是说,模拟器只显示在当前指定的MIF目录中有有效.mif文件的应用程序。你可以将生成的helloBREW.mif移到,例如,“..yourBREWdir\Examples\yourmif\256Color\”中,然后在模拟器的工具菜单中将它设置为初始的mif目录。详细的设置指导可以参考BREW MIF编辑器指南。
如果您按照本文开始部分的指导来设置Visual C++的部分,你可以象平常一样使用Visual C++调试器。例如,为了确信AEEClsCreateInstance()象所期望的那样工作,你可以将光标置于这个函数中,并点击调试工具条中的“Run to Curor”。然后你可以单步运行这个函数,设置监视某些变量的值,跳入其它函数,或者将光标置于其它函数或者事件句柄并且再次点击“Run to Curor”。如果你对Visual C++调试器不熟悉,你应该阅读Visual C++自带文档的相关章节。
如果模拟器在启动的时候不能显示Sharp Z800的话机界面,你可以利用File> Load Device...来更换所模拟的设备。在“...yourBREWdir\devices\”中选择Z800话机设备文件,以qsc结尾的,并点击打开以加载该设备。
最后需要注意的是2.0SDK中所带的模拟器结合了更为严格的堆检验,这将帮助你找到内存溢出,数组越界等在早期开发过程中可能出现的错误。2.0的模拟器可以与1.x的SDK联合使用。关于如何在一台机器上安装多个版本的SDK等信息可以参考SDK2.0的安装指导。
© Copyright 2002, Golden Creek Software Inc.