BREW做的第一个程序--Hello world!

  这几天开始做BREW开发了,刚开始挺晕的。又是C指针,又是BREW的SDK文档,还有环境配置,一大堆东东,真是让人手忙脚乱。好不容易配好了环境,写出了第一个Hello world!程序。感觉还不错,就把代码和想法贴出来,和大家分享,希望大家指点下。

   

需求:一进入应用程序,展示的页面是灰色的背景,屏幕的正中央输出白色的Hello world!字样。在屏幕的下方,留有30px高的一块空白来放置菜单栏。

需求分析及具体实现:

  •  是黑色的背景,所以先给整个背景(除了最底下)填充灰色。填充背景色所需要用到的方法:IDISPLAY接口的IDISPLAY_FillRect(IDisplay *po,AEERect * pRect, RGBVAL clrFill )方法。第一个参数是一个指向IDisplay接口的指针,第二个参数是要使用指定颜色填充的矩形的有效指针,第三个参数是用于填充矩形的颜色。第二个参数的使用:先是申明一个AEERECT类型的变量rect,然后用SETAEERECT宏来初始化rect变量(用法参见SDK)。第三个参数的用法:可以用MAKE_RGB宏来设置RGB值(用法参见SDK)。
  • 输出Hello world!字样。先定义一个字符数组用来存储Hello world!。然后把其输出屏幕,这里用到了IDISPLAY接口的IDISPLAY_DrawText(IDisplay *po, AEEFont Font,

const AECHAR * pcText, int nChars, int x, int y, const AEERect * prcBackground, uint32 dwFlags )方法,这里没有特别说明的,详细请参见SDK

  • 最后,将屏幕更新,将输出显示出来。这里用到了IDISPLAY接口的IDISPLAY_Update(Idisplay *pIDisplay)方法。
  • 完毕。

需要注意的事项:

  • 实现中多处用到了指向IDISPLAY接口的指针。在程序自动生成的结构体定义里有AEEApplet      a ;的定义。因为IDISPLAYISHELL、IModule这三个接口经常用到,所以它们已经包含在AEEApplet的结构定义中。所以,在程序中要引用指向这三个接口的指针,可以使用pMe->a.pIDisplaypMe->a.pIShellpMe->a.pIModule来调用(这里的pMe是指向本程序的指针)。另,如果嫌这样麻烦或名称没有顾名思义性,可以在程序结构体的定义里加上自己定义的指向所需接口的指针。如:IShell* pIShell。但是注意,如果这样定义了,在使用前一定得给它们赋于实际的值。如:pMe->pIShell=pMe->a.pIShell;
  • BREW不支持全局变量和静态变量,用上述的第二种方法可以变通的实现全局变量。

 

程序如下(去掉了自动生成的大篇幅的注释部分):

 

ExpandedBlockStart.gif代码
  1 #include "AEEModGen.h"          // Module interface definitions
  2 #include "AEEAppGen.h"          // Applet interface definitions
  3 #include "AEEShell.h"           // Shell interface definitions
  4 #include "AEE.h"
  5 #include "AEEMenu.h"
  6 
  7 #include "studycontinue.bid"
  8 #define TITLE_BACK_COLOR        MAKE_RGB(28,28,28)//MAKE_RGB(222,222,222)
  9 #define TITLE_HEIGHT        30
 10 /*-------------------------------------------------------------------
 11 Applet structure. All variables in here are reference via "pMe->"
 12 -------------------------------------------------------------------*/
 13 // create an applet structure that's passed around. All variables in
 14 // here will be able to be referenced as static.
 15 typedef struct _studycontinue {
 16     AEEApplet      a ;           // First element of this structure must be AEEApplet
 17     AEEDeviceInfo  DeviceInfo; // always have access to the hardware device information
 18 
 19     // add your own variables here...
 20 
 21     IShell            *pIShell;
 22     AEERect         m_rScreenRect;  // Screen Rect
 23     IMenuCtl        *pIMenuCtl;
 24     IMenuCtl*               m_pMenu;        // Main Menu
 25     IMenuCtl*                pSoftCtl;
 26 
 27     boolean                    bMenuIsRoot;
 28 } studycontinue;
 29 
 30 /*-------------------------------------------------------------------
 31 Function Prototypes
 32 -------------------------------------------------------------------*/
 33 static  boolean studycontinue_HandleEvent(studycontinue* pMe, 
 34                                                    AEEEvent eCode, uint16 wParam, 
 35                                                    uint32 dwParam);
 36 boolean studycontinue_InitAppData(studycontinue* pMe);
 37 void    studycontinue_FreeAppData(studycontinue* pMe);
 38 static void DrawEverything(studycontinue* pMe);
 39 
 40 /*===============================================================================
 41 FUNCTION DEFINITIONS
 42 =============================================================================== */
 43 int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *po, void **ppObj)
 44 {
 45     *ppObj = NULL;
 46 
 47     if( ClsId == AEECLSID_STUDYCONTINUE )
 48     {
 49         // Create the applet and make room for the applet structure
 50         if( AEEApplet_New(sizeof(studycontinue),
 51                           ClsId,
 52                           pIShell,
 53                           po,
 54                           (IApplet**)ppObj,
 55                           (AEEHANDLER)studycontinue_HandleEvent,
 56                           (PFNFREEAPPDATA)studycontinue_FreeAppData) ) // the FreeAppData function is called after sending EVT_APP_STOP to the HandleEvent function
 57                           
 58         {
 59             //Initialize applet data, this is called before sending EVT_APP_START
 60             // to the HandleEvent function
 61             if(studycontinue_InitAppData((studycontinue*)*ppObj))
 62             {
 63                 //Data initialized successfully
 64                 return(AEE_SUCCESS);
 65             }
 66             else
 67             {
 68                 //Release the applet. This will free the memory allocated for the applet when
 69                 // AEEApplet_New was called.
 70                 IAPPLET_Release((IApplet*)*ppObj);
 71                 return EFAILED;
 72             }
 73 
 74         } // end AEEApplet_New
 75 
 76     }
 77 
 78     return(EFAILED);
 79 }
 80 
 81 
 82 static boolean studycontinue_HandleEvent(studycontinue* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
 83 {  
 84     if(pMe->pIMenuCtl && IMENUCTL_IsActive(pMe->pIMenuCtl) && IMENUCTL_HandleEvent(pMe->pIMenuCtl,eCode,wParam,dwParam))
 85         return TRUE;
 86     if(pMe->pSoftCtl && IMENUCTL_IsActive(pMe->pSoftCtl) && IMENUCTL_HandleEvent(pMe->pSoftCtl,eCode,wParam,dwParam))
 87         return TRUE;
 88     switch (eCode) 
 89     {
 90         // App is told it is starting up
 91         case EVT_APP_START:                     
 92             // Add your code here...
 93             DrawEverything(pMe);
 94             DrawMenu(pMe,TRUE);
 95             return(TRUE);
 96 
 97 
 98         // App is told it is exiting
 99         case EVT_APP_STOP:
100             // Add your code here...
101 
102               return(TRUE);
103 
104 
105         // App is being suspended 
106         case EVT_APP_SUSPEND:
107             // Add your code here...
108 
109               return(TRUE);
110 
111 
112         // App is being resumed
113         case EVT_APP_RESUME:
114             // Add your code here...
115 
116               return(TRUE);
117 
118 
119         // An SMS message has arrived for this app. Message is in the dwParam above as (char *)
120         // sender simply uses this format "//BREW:ClassId:Message", example //BREW:0x00000001:Hello World
121         case EVT_APP_MESSAGE:
122             // Add your code here...
123 
124               return(TRUE);
125 
126         // A key was pressed. Look at the wParam above to see which key was pressed. The key
127         // codes are in AEEVCodes.h. Example "AVK_1" means that the "1" key was pressed.
128         case EVT_KEY:
129             // Add your code here...
130 
131               return(TRUE);
132         case EVT_COMMAND:
133             return TRUE;
134 
135 
136         // If nothing fits up to this point then we'll just break out
137         default:
138             break;
139    }
140 
141    return FALSE;
142 }
143 
144 
145 // this function is called when your application is starting up
146 boolean studycontinue_InitAppData(studycontinue* pMe)
147 {
148     IShell * pIShell = pMe->a.m_pIShell; // Cache Shell Pointer
149     // Get the device information for this handset.
150     // Reference all the data by looking at the pMe->DeviceInfo structure
151     // Check the API reference guide for all the handy device info you can get
152     pMe->DeviceInfo.wStructSize = sizeof(pMe->DeviceInfo);
153     ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->DeviceInfo);
154 
155     // Insert your code here for initializing or allocating resources...
156 
157     
158     /*if((ISHELL_CreateInstance(pIShell, AEECLSID_MENUCTL, (void**)(&pMe->m_pMenu)) != SUCCESS)) 
159         return FALSE;*/
160     if((ISHELL_CreateInstance(pIShell, AEECLSID_SOFTKEYCTL, (void**)(&pMe->pSoftCtl)) != SUCCESS)) 
161         return FALSE;
162 
163     // if there have been no failures up to this point then return success
164     return TRUE;
165 }
166 
167 // this function is called when your application is exiting
168 void studycontinue_FreeAppData(studycontinue* pMe)
169 {
170     // insert your code here for freeing any resources you have allocated...
171 
172     // example to use for releasing each interface:
173     // if ( pMe->pIMenuCtl != NULL )         // check for NULL first
174     // {
175     //    IMENUCTL_Release(pMe->pIMenuCtl)   // release the interface
176     //    pMe->pIMenuCtl = NULL;             // set to NULL so no problems trying to free later
177     // }
178     //
179     /*if(pMe->m_pMenu)
180     {
181         IMENUCTL_Release(pMe->m_pMenu);
182         pMe->m_pMenu = NULL;
183     }*/
184     if(pMe->pSoftCtl)
185     {
186         IMENUCTL_Release(pMe->pSoftCtl);
187         pMe->pSoftCtl = NULL;
188     }
189 }
190 
191 static void DrawEverything(studycontinue* pMe)
192 {
193     AECHAR helloworld[] = {'H','e','l','l','o',',','W','o','r','l','d','\0'};
194     AEERect rect;
195     SETAEERECT(&rect,0,0,pMe->DeviceInfo.cxScreen,pMe->DeviceInfo.cyScreen-30);    
196     
197     IDISPLAY_FillRect(pMe->a.m_pIDisplay,&rect,TITLE_BACK_COLOR);
200     IDISPLAY_DrawText(pMe->a.m_pIDisplay,AEE_FONT_BOLD,helloworld,-1,0,0,NULL,IDF_ALIGN_CENTER|IDF_ALIGN_MIDDLE|IDF_TEXT_INVERTED);
201     IDISPLAY_Update(pMe->a.m_pIDisplay);
202 }

 

 

     关于菜单栏的实现,我下次再发,现在还没有想好怎么做。嘻嘻~

转载于:https://www.cnblogs.com/wchhuangya/archive/2009/12/28/1634396.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

careercup-链表 2.1

2.1 编写代码,移除未排序链表中的重复节点。 不使用临时缓存: 如果不允许使用临时的缓存(即不能使用额外的存储空间),那需要两个指针, 当第一个指针指向某个元素时,第二个指针把该元素后面与它相同的元素删除&#xff…

随机排列_“按字母顺序排列”其实是种随机顺序

闲话之前有聊过,微信公众号这边接的广告不多,主要收益来自于微信自带的中插广告。后来同学们还开玩笑说“研究半天没发现这个图片哪里没品了,才发现是广告。”另外还有一部分收益,来自于各位的打赏。鉴于大部分人都是打赏一两块钱…

android 获取应用的资源id和uri

2019独角兽企业重金招聘Python工程师标准>>> 在某些应用中,为了实现应用apk资源放入重复利用,或者使用反射得到本应用的资源,需要使用反射反射方式获得,但Resources类中也自带了这种获取方式,并且功能更加强…

(SQL语句)按指定时间段分组统计

我现在有一张表: 列名1 时间 03174190188 2009-11-01 07:17:39.217 015224486575 2009-11-01 08:01:17.153 013593006926 2009-11-12 08:04:46.560 013599584239 2009-11-22 08:53:27.763 013911693526 2009-11-23 08:53:51.683 013846472440 2009…

数据库迁移_数据库迁移了解一下

mongodb数据迁移因服务器到期,需要将之前机器上面的数据进行数据迁移,并将服务全部docker化备份首先需要将现有即将到期的服务器上面的mongo数据进行备份mongodump -h dbhost -d dbname -o dbdirectory-h:mongodb所在服务器地址,可…

人脸颜值评分软件_在线算个颜值,特科学的那种 | 知多少

用 AI,科学的为颜值打个分。用 AI,打造科学颜值打分器https://www.zhihu.com/video/1185672892095848448图文版本送给不方便打开的朋友 (●u●)」如何科学的为颜值打个分?三庭五眼、四高三低?脸部是否对称?是否与本民族…

图片翻转

图片翻转 原文:图片翻转本人录制技术视频地址:https://edu.csdn.net/lecturer/1899 欢迎观看。这一节继续为大家介绍CSS3的动画效果: 图片翻转。 在iOS中的章节中,我也介绍过类似的效果,如果感兴趣的话,请点击这里查看&#xff1a…

【原】页面跳转以及表单提交中有中文的解决办法

这两天一直碰到一个郁闷的问题,在对表单进行提交的时候,用户名是中文的,怎么测试都不通过, 今天上午突然想起来是不是因为中文字符编码的问题!经过测试,果然是因为这个问题! 现在把解决方法贴出来!呵呵&…

实验吧之NSCTF misc250

下载的是一个流,用wireshark打开,由于原题是这样的:小绿在学习了wireshark后,在局域网内抓到了室友下载的小东东0.0 你能帮他找到吗?说明我们应该重点关注http传送的东西: 这里面一共有四个http文件&#x…

西澳大学商科专业排名_澳洲西澳大学优势专业排名多少

澳洲西澳大学优势专业排名多少西澳大学农业和林业专业在2018年QS世界排名中排名第32西澳大学解剖学和生理学专业在2018年QS世界排名中排名第13西澳大学地球与海洋科学专业在2018年QS世界排名中排名第32西澳大学土木结构工程专业在2018年QS世界排名中排名第37西澳大学矿产和采矿…

基于SOUI开发的应用展示

本页面列出基于SOUI开发的产品 欢迎使用SOUI的朋友提供资源:setoutsoft#qq.com #-> U大师 http://www.udashi.com EiisysIM: 是一款为工作场景而设计的企业即时通讯软件, ,含PC版和手机版。具有完善的即时通讯、文件传输、语音通话等功能。通讯录由企…

供应商寄售库存管理_【论文解读】物流联合外包下库存管理模式对供应链运作的影响...

物流联合外包下库存管理模式对供应链运作的影响作者:冯颖,林晴,张景雄,张炎治目录 1 引言2 问题描述3 数学模型4 协调模型5 数值算例6 结论1 引言传统库存管理模式下,供应链中各节点企业的库存管理各自为政&#xff0c…

SQLserver2000 实例管理工具

1、企业管理器是microsoft管理控制台(Microsoft management console)的一个插件。插件是运行在MMC中的部件、他不能独立运行,但必须包含着MMC中。企业管理器提供MMC形式的界面。像IIS、MTS也是MMC插件 2、查询分析器右边有模板选项卡,可以创建现成的模板…

linux设置nexus开机自启动_CentOS7配置nexus开机自启动

CentOS7配置nexus开机自启动新建nexus启动脚本进入/etc/init.d目录,新建脚本文件nexus// 进入/etc/init.d[rootlinux_maven etc]# cd /etc/init.d/// 新建脚本文件nexus[rootlinux_maven init.d]# vim nexus脚本内容:#!/bin/bash#chkconfig:2345 20 90#description:…

c语言6-2

#include<stdio.h> int main(){int a[3][3]{2,3,5,45,23,65,8,46,67};int s,t;sa[0][0]a[2][2]a[1][1];ta[0][2]a[1][1]a[2][0];printf("%d\n%d\n",s,t);return 0;} 转载于:https://www.cnblogs.com/p201821440019/p/10819405.html

怎么把ai从c盘移动到d盘_ai暂存盘怎么设置-AI设置暂存盘的教程 - 河东软件园

Adobe Illustrator简称AI&#xff0c;这款软件使用用户绘制图形的软件&#xff0c;它被大量的使用在了logo的设计中。相信每一位logo设计人员对它都不陌生吧&#xff1f;AI和PS都是同属于adobe旗下的图形设计软件&#xff0c;因此很多的设置功能都是一样的&#xff0c;例如暂存…

c 最大子序列和_算法总结:左神class8—跳台阶+最长递增公共子序列

【跳台阶】有n级台阶&#xff0c;一个人每次上一级或者两级&#xff0c;问有多少种走完n级台阶的方法?public int s1(int n){ if (n< 1){ return 0; if(n 1 || n 2){ return n; return s1(n - 1) s1(n - 2);}【最长递增子序列长度】给定数组arr&#xff0c;返回arr…

[转载]dynamic的小坑--RuntimeBinderException:“object”未包含“xxx”的定义

创建一个控制台项目和一个类库项目, 在类库中创建一个匿名对象&#xff0c;然后在控制台中访问它&#xff0c;代码如下&#xff1a; 控制台: namespace ConsoleApplication1 {class Program{static void Main(string[] args){dynamic dyc ClassLibrary1.TestClass.Test();Cons…

第5篇K8S创建资源的两种方式

一、创建方式分类&#xff1a;命令 vs 配置文件Kubernetes 支持两种方式创建资源&#xff1a;1.用 kubectl 命令直接创建&#xff0c;比如&#xff1a;kubectl run httpd-app --imagereg.yunwei.edu/learn/httpd:latest --replicas2在命令行中通过参数指定资源的属性。2. 通过配…

bind安装配置以及应用

实验环境&#xff1a;两台centos6.6服务器&#xff0c;主DNS服务器IP为172.26.249.29&#xff0c;从DNS服务器IP为172.16.249.98&#xff0c;解析域名为stu07.com一、主DNS服务器搭建1、 检查系统是否安装bind包&#xff0c;否则用yum安装2、安装好bind包后&#xff0c;编辑主…