手机高通平台BUIW简介
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BUIW Training 01/07 2008
Content
•预备知识
•Dialog框架(历史回顾)
•BUIW概述
•BUIW基本原理
•BUIW的使用(用BUIW构建app的UI)
预备知识
•高通平台的mmi由许多app组成,每个app可分为logic和ui,app的ui由一系列的界面组成,每个界面由多个界面元素组成,比如一个图标,一个字符串,都是界面元素。在Dialog体制框架下,一个界面就是一个Dialog,一个或多个相关的界面元素构成一个Control,在BUIW下,它们分别叫做Form和Widget。
预备知识
•IDisplay对象
类似MFC里的CDC对象,每个app有自己IDisplay对象,重要的函数如下
IDISPLAY_DrawText绘制文本
IDISPLAY_MeatureTextEx测量文本宽度
IDISPLAY_SetColor设置颜色(比如文的前背景色)
IDISPLAY_SetClipRect设置剪切区域
IDISPLAY_Update更新屏幕
IDISPLAY_FillRect以指定颜色填充矩形
•IImage对象
IImage_Draw绘制图片
IImage_SetOffset设置源图的偏移(画源图的一部分)
IImage_SetDrawSize设置图的剪切大小
画图的一般方法
P_img=ISHELL_LoadResImage();
IImage_Draw(P_img);
IImage_Release(P_img);
UI框架就是对上述函数的封装,app程序员可以只用上述函数实现一个app的ui,但工作量很大,不易扩展,维护。
预备知识
•三个重要的接口
1.IBASE接口
IBASE是所有对象的基类,记录对象的引用数量,确定对象的创建和释放uint32 (*AddRef) (iname*); //加引用数量
uint32 (*Release) (iname*); //减引用数量
2.IQueryInforace接口
继承于IBASE,支持接口查询,若查询成功,返回指针,并增加引用计数
int(*QueryInterface)(iname*, AEECLSID, void **);//查询接口
3.IHandler接口
继承于IQueryInforace,具备消息处理机制
boolean(*HandleEvent) (iname*,AEEEvent evt,uint16 wParam,uint32 dwParam);
void (*SetHandler)(iname*, HandlerDesc*pDesc); //设置消息处理器
•用Dialog构建app的UI的大致过程
1.用Brew SDK里的Resource Editor新建Dialog,在Dialog里添加几个Control,(只
能添加它支持的控件),保存为*.brx,build,生成bar,同时生成brh
2.在程序中,调用ISHELL_CreateDialog创建Dialog,并设置Handle
boolean wordclock_HandleEvent(wordclock*pMe,AEEEvent eCode,uint16 w,uint32 dw)
{
switch (eCode)
{
case EVT_APP_START:
ISHELL_CreateDialog(pMe->a.m_pIShell,WC_RES_FILE, IDD_DIALOG_MAIN, NULL);
return(TRUE);
case EVT_DIALOG_INIT:
IDIALOG_SetEventHandler((IDialog*)dwParam,
(PFNAEEEVENT)WorldClockDlgEvtHdrs[wParam-WORLDCLCOK_DLG_BASE],
(void *)pMe);
IDIALOG_SetProperties((IDialog*)dwParam,DLG_HANDLE_ALL_EVENTS);
return TRUE;
…………………………….
}
}
3.在Dialog的Handle里用如下办法访问Control
boolean wordclock_DlgHdlMain(wordclock*pMe,AEEEvent evt,uint16 w,uint32 dw) {
switch(evt)
{
case EVT_DIALOG_START:
pIDialog=ISHELL_GetActiveDialog(pMe->a.m_pIShell);
p_ImgCtrl=IDIALOG_GetControl(pIDialog,IDC_MAIN_TEXT);
IIMAGECTL_SetRect(p_ImgCtrl,&rc);
return TRUE;
……………………….
}
}
•Dialog的问题
app对dialog的管理没有代码,dialog对Control的管理也没有代码,事件在它们间的传递更没有代码,很多Control也没有代码,由于brew已有的Control无法满足ui的要求,所在venice项目上,自主开发了menu和list,但menu,list没有被Dialog管理,需要app程序员主动调用相应过程来传递事件和重画。在venice项目上,很多数界面元素都是app程序员调用IDisplay或IImage接口直接画屏,总之,控件化,模块化程序不高,app程序员和组件程序员的职责不清。因此,在ROMA项目中,我们采用了BUIW框架