现在的位置: 首页 > 综合 > 正文

20110601 BREW ProGramming Guide知识点小结

2013年07月18日 ⁄ 综合 ⁄ 共 8582字 ⁄ 字号 评论关闭

BREW ProGramming Guide

1、指定.mif文件所在的路径不能含有中文,否则找不到.mif文件,切记。

2、应用对应的.dll文件存在于.mif文件所在目录的下一级目录,而应用所在目录的名称必须同应用对应的.mif文件的名称一致,否则BREW不能正

确的找到应用。(允许两个文件名大小写可以不一致)

3、.bid文件其实就是一个头文件,其中仅仅定义了一个应用的class ID,对于商用的applet必须在高通的web站点索取。

4、模拟器使用的代码是以一个windows的.dll文件存在,而手机(真机)使用的是以一个.mod文件。

5、BREW程序有动态和静态之分,静态主要是由终端提供商开发,在出厂时内嵌在终端中,动态的应用一般是可提供下载的(动态的应用)。

6、一般一个动态的应用必须包含接口AEEClsCreateInstance(),它是BREW App的入口函数。在这个函数中一般调用AEEApplet_New()接口来为App

分配必要的控件,并指明事件处理函数。

7、在事件处理接口中,一般的处理事件有:
 EVT_APP_START……………………Applet开始启动时发送的这个事件
 EVT_APP_STOP ……………………Applet结束时发送这个事件
 EVT_APP_SUSPEND…………………Applet需要挂起时,比如来电,发送该事件
 EVT_APP_RESUME …………………Applet挂起结束,比如用户通话结束,发送该事件
 EVT_KEY……………………………Applet接收必要的用户按键事件
 #define EVT_TIMER (EVT_USER+1)
 EVT_TIMER…………………………Applet为用户扩展事件而定义的,使用方法:
ISHELL_PostEvent(pIshell,AEECLSID_HELLO,EVT_TIMER,0,0)…………Post只是将事件放入事件队列,等待合适的机会去执行
或者
ISHELL_SendEvent(pIshell,AEECLSID_HELLO,EVT_TIMER,0,0)…………Send则马上处理,只有该事件处理完毕,该接口才算调用结束。

8、在BREW中,所有的接口的坐标原点都是左上角,对于每一个控件则有它们自己的坐标原点,但是实际上我们都必须为每个控件指定显示矩阵。

9、如果出现提示:“this application have been unloaded to save memory, your must download a new veision”这说明跟.mif文件对用的

同名的目录不存在或者目录下没有.dll文件存在,注意将project->setting->link:output file name 编辑框中的debug去掉。

10、对文本操作的接口主要有以下几个:
 IDISPLAY_MeasureText()…………int IDISPLAY_MeasureText(IDisplay* po,AEEFont Font,const AECHAR* pcText)
--------该接口测量pcText中所包含的文本以Font字体显示时,所占用的像素宽度,返回值即为宽度

 IDISPLAY_MeasureTextEx()………int IDISPLAY_MeasureTextEx(IDisplay* po,AEEFont Font,const AECHAR* pcText,int nChars,int

nMaxWidth,int* pnFits)
--------该接口也是测量宽度,不同之处在于参数nChars指明了测量pctext中多少个字符,以及当实际宽度大于nMaxWidth时,在宽度nMaxWidth

中最大可显示多少个字符数,返回的pnFits指明了在nMaxWidth限制下实际适合显示的字符数,该接口的返回值为pnFits字符所占用的实际宽度,

该值小于或等于nMaxWidth

 IDISPLAY_DrawText() ……………int IDISPLAY_DrawText(IDisplay* po,AEEFont Font, const AECHAR* pcText,int nChars,int

x,int y,const AEERect*prcBackGround,uint32 dwFlags)
--------该接口将pcText中的前nChars文本(如果nChars等-1,那就是所有文本)以Font字体的形式显示在(x,y)开始的位置,prcBackground为

clip rect,限制文本在屏幕上的显示范围,如果为NULL,表示在全屏内没有限制,dwFlags是一些属性值,比如:
--------IDF_TEXT_TRANSPARENT----------透过底色
--------IDF_TEXT_UNDERLINE------------给文本加下划线

 IDISPLAY_GetFontMetrics() ……int IDISPLAY_GetFontMetrics(IDisplay* po,AEEFont Font,int *pnAscent,int* pnDescent)
--------通过该接口可以得到支持的字体的ascent,descent,和height信息。该接口的返回值即为字体的高度,实际上height = ascent +

descent

 IDISPLAY_SetFont()………………IFont* IDISPLAY_SetFont(IDisplay* po,AEEFont nFont,IFont* piNewFont)
--------这个接口不常用

 IDISPLAY_SetColor() ……………RGBVAL IDISPLAY_SetColor(IDisplay* po,AEEClrItem,RGBVAL rgb)
--------这个接口用来设置指定的颜色条目的颜色,比如设定默认的文本颜色,默认的背景颜色,在使用绘画文本的接口中没有指定颜色的参数

,返回的是以前设置的颜色,记住使用完新设置的颜色后要还原到以前的颜色。

11、按键状态主要包括按键的按下,释放和保持,每一用户按下一个按键,都会发丝那个EVT_KEY_PRESS事件,一般紧接着会发送EVT_KEY事件,

如果用户在一段时间内没有释放按键,就会发送EVT_KEY_HELD事件,当用户释放按键后,会发送EVT_KEY_RELEASE事件,当发生按键事件时,

wParam指明的是哪一个按键状态发生了变化,而dwParam为0。按键值都是以AVK_开头的。

12、在BREW API中涉及到timer接口主要有两个,如下:
 ISHELL_SetTimer()………………int ISHELL_SetTimer(IShell* po,int32 dwMSecs,PFNNOTIFY pfn, void* pUser)
 ISHELL_CancelTimer() …………int ISHELL_CancelTimer(IShell* po,PFNNOTIFY pfn, void* pUser)
--------注意ISHELL_SetTimer()只起一次作用,如果需要,必须再调用一次该接口

13、在BREW开发环境中主要包含三种资源:字符串,图片和对话框资源
 ISHELL_LoadResString()…………int ISHELL_LoadResString(IShell* po,const char* pszBaseFile,uint16 nResID,AECHAR*

pBuff,int nSize)
--------返回值是实际加载字符串的长度

14、菜单是建立用户界面最常用的工具,按形式分类有主功能菜单,弹出式菜单和下拉式菜单,在无线设备中最常用的就是主功能菜单和弹出式

菜单了。一个标准的菜单的建立一般需要四个步骤:
第一、初始化,使用下面接口完成
--------IMenuCtl* pMenuCtl;
--------IMENUCTL_Reset(pMenuCtl);
--------IMENUCTL_SetActive(pMenuCtl,FALSE);
第二、增加菜单项
--------CtlAddItem rMenuItem;
--------rMenuItem.pText = NULL;
--------rMenuItem.pImage= NULL;
--------rMenuItem.pszResImage = rMenuItem.pszResText =;//资源文件名
--------rmenuItem.wFont = ;//AEE_FONT_NORMAL
--------rMenuItem.wText = ;//text id
--------rMenuItem.wImage = ;//icon id
--------rMenuItem.wItemID = ;//user for command
--------IMENUCTL_AddItemEx(pMenuCtl,&rMenuItem);
--------//Add other items
--------rMenuItem.wText = IDC_COLOR;
--------rMenuItem.wImage= IDB_COLOR;
--------rMenuItem.wItemID= IDC_COLOR;
--------IMENUCTL_AssItemEx(pMenuCtl,&rMenuItem);
第三、设置菜单样式
--------AEEItemStyle nNormal;
--------AEEItemStyle nSel;
--------IMENUCTL_SetTitle(IMenuCtl* pIMenuCtl,const char* pszResFile,uint16 wResID,AECHAR* pText)
第四、设置菜单属性并显示
--------AEERect nRect;
--------IMENUCTL_SetProperties(pMenuCtl,IMENUCTL_GetProperties(pMenuCtl)&~(MP_ICON_TEXT_TOP));
--------SETAEERECT(&nRect,x,y,dx,dy);
--------IMENUCTL_SetRect(pMenuCtl,&nRect);
--------IMENUCTL_SetActive(pMenuCtl,TRUE);

15、标准对话框使用下面两个接口:
 ISHELL_MessageBox()--------boolean ISHELL_MessageBox(IShell* po,const char* pszRes,uint16 wTitleID,uint16 wTextID)
--------从资源文件中取显示文本
 ISHELL_MessageBoxText()----boolean ISHELL_MessageBoxText(IShell* po,const AECHAR* pTitle,const AECHAR* pText)
--------显示变量中的文本

16、对话框操作的基本接口如下:
 ISHELL_CreateDialog()-------int ISHELL_CreateDialog(IShell* po,const char* pszRes,uint16 wID,DialogInfo* pInfo)
--------创建一个对话框,pszRes指向资源文件名,wID是对话框对应的ID,如果前两个指定了,pInfo为NULL就可以了。
 ISHELL_EndDialog()----------int SHELL_EndDialog(IShell* po)
--------关闭当前运行的对话框
 IDIALOG_GetControl()--------IControl* IDIALOG_GetControl(IDialog* po,int16 wID)
--------得到指定对话框中的一个控件的控制结构
 IDIALOG_SetEventHandler()---void IDIALOG_SetEventHandler(IDialog* po,PFNAEEEVENT pfn,void* pUser)
--------给指定的对话框设置处理函数

17、对于Dialog的一个组件使用过程:
--------1.调用ISHELL_CreateInstance()创建一个实例
--------2.利用得到的实例,使用相关的接口设置属性,剪切矩形等
--------3.如果有的话,用其提供的事件处理接口处理事件
--------4.得到结果,并释放实例对象

18、画点除了IGraphic接口之外似乎没有提供另外的画点接口,但是我们间接来实现画点的目的,那就是使用接口:IDISPLAY_FillRec

(p,pr,clrFill);设置其宽度和高度为1个像素。
--------AEERect rc;
--------SETAEERECT(&rc,5,10,1,1);
--------IDISPLAY_FillRect(pIDisplay,&rc,MAKE_RGB(0,0,255));

19、画直线在IGraphic接口中可以画任意倾斜度的直线,IDisplay提供了做水平线和竖线的接口:
 IDISPLAY_DrawHLine(pIDisolay,x,y,len);//Horizontal line
 IDISPLAY_DrawVLine(pIDisplay,x,y,len)//Vertical line
这两个接口最终还是要用到IDISPLAY_FillRect();

20、矩形框和填充矩形使用的接口是:
 IDISPLAY_FrameRect();//draw frame
 IDISPLAY_InvertRect();//invert rectangle
 IDISPLAY_EraseRect();//erase rect
 IDISPLAY_DrawRect();//draw frame or fill rect
其实对矩形的操作都是可以由IDISPLAY_DrawRect()完成。

21、如何解码已经读到memor中的图像数据:
--------1.首先必须创建一个PNG的操作实例:
--------if(ISHELL_CreateInstance(pApp->a.m_pIShell,AEECLSID_PNG,(void**)(&pApp->m_pIImage))!=SUCCESS)
--------{ return FALSE; }
--------2.需要创建一个memory stream实例
--------if(ISHELL_CreateInstance(pApp->a.m_pIShell,AEECLSID_MEMASTREAM,(void**)(&pApp->m_pIMemAStream))!=SUCCESS)
--------{
--------  IIMAGE_Release(pApp->m_pIImage);
--------  pApp->m_pIImage = NULL;
--------  return FALSE;
--------}
--------3.设立通知函数以便在解码完成以后解码器通知用户,然后用户就可以使用解码后的数据进行任何自己想要的操作,比如放大,缩小,

绘制等等。
--------IIMAGE_Notify(pApp->m_pIImage,(PFNIMAGEINFO)decode_end,(void**)pDecdata);
--------decode_end就是通知函数,用户可以自己改变,pDecData是通知函数的参数。
--------4.给解码器只是数据存在的buffer地址以及buffer的size
--------IMEMASTREAM_SetEx((IMemAStream*)pApp->m_pIMemAStream,(byte*)pbuf,buf_size,0,(PFNNOTIFY)pfn,(void*)pUser);
--------5.最后就是将Image跟memory stream关联起来
--------IIMAGE_SetStream(pApp->m_pIImage,(IAStream*)pApp->m_pIMemAStream);

22、屏幕拷贝,比如保存为一个BMP格式的文件等等
--------1.得到device的当前屏幕的bitmap
--------if(IDISPLAY_GetDeviceBitmap(pApp->a.m_pIDisplay,&pDeviceBitmap)!=SUCCESS)
--------  return FALSE;
--------2.创建一个具有相同图像格式的bitmap
--------if(IBITMAP_CreateCompatibleBitmap(pDeviceBitmap,&pApp->m_pBackupDevBitmap,(uint16)(pApp->m_ClientAreaRect.dx),(uint16)

(pApp->m_ClientAreaRect.dy))!= SUCCESS)
--------{
--------  IBITMAP_Release(pDeviceBitmap);
--------  return FALSE;
--------}
--------3.将当前device的bitmap数据传给新创建的这个bitmap,并解释device的bitmap
--------IBIMAP_BitIn(pApp->m_pBackupDevBitmap,0,0,(uint16)(pApp->m_ClientAreaRect.dx),(uint16)(pApp-

>m_ClientAreaRect.dy),pDeviceBitmap,0,0,AEE_RO_COPY);
--------IBITMAP_Release(pDeviceBitmap);
--------现在pApp->m_pBackupDevBitmap中存放的就是整个屏幕client area内的所有图像数据了
--------4.得到buffer数据,将IBitmap强制转化为IDIB数据类型,你就可以得到你想要的任何数据了。
--------Struct IBitmap
--------{
--------  IDIB pIDib;
--------  others;
--------}

23、在使用任何File接口之前,你必须先创建filemgr接口,如下:
--------if(SUCCESS != ISHELL_CreateInstance(pApp->a.m_pIShell,AEECLSID_FILEMGR,(voif**)()&pApp->m_pIFilrMgr)))
--------{
--------  return FALSE;
--------}

24、得到已经打开文件的大小可以使用IFILE_Seek(pIFile,_SEEK_START,0)与IFILE_Seek(pIFile,_SEEK_END,0)的返回值之差就是文件的大小看

出来的。注意在BREW中,文件名的大小最长是64个字节,这是包括路径名。

25、不管是使用UDP还是TCP,它都是一个异步的过程,所以当send不成功应该调用接口ISOCKET_Writeale(),当发送成功后,我们应该调用接口

ISOCKET_Readable().

26、UDP使用的一组接口:
--------INETMGR_OpenSocket(pINetMgr,AEE_SOCK_DGRAM)
--------ISOCKET_SendTo()
--------ISOCKET_RecvFrom()
--------ISOCKET_Cancel()
--------ISOCKET_Release()
--------ISOCKET_Writeable()
--------ISOCKET_Readable()
TCP使用的一组接口:
--------INETMGR_OpenSocket(pINetMgr,AEE_SOCK_STREAM)
--------ISOCKET_Connect()
--------ISOCKET_Write()'
--------ISOCKET_Read()
--------ISOCKET_Close()
--------ISOCKET_Release()
--------ISOCKET_Cancel()
--------ISOCKET_Writeable()
--------ISOCKET_Readable()
--------不管是使用UDP还是使用TCP都要涉及到一个Net Manager Object,这就需要用下面的接口创建
--------if(ISHELL_CreateInstance(pApp->a.m_pIShell,AEECLSID_NET,(void**)(&pApp->m_pINetMgr))!= SUCCESS)
--------return FALSE;

 

 

抱歉!评论已关闭.