一直是使用的纯C写的BREW程序,由于一些原因,自己开始琢磨使用C++开发BREW,并且在金融界的BREW版本中使用了该框架,感觉比较方便,
现在总结一哈经验与大家分享一哈。(后付源代码工程,编译成功,绝对无木马,欢迎广大群众放心使用)
1。内存的分配是释放
BREW下,只能由平台提供的接口分配和释放,所以我们要按规矩办事,需要inline我们久违的操作符 new 和 delete ,
哇,我好喜欢new哦。。。记得要delete哦
源码:
inline void* operator new (size_t,void* a0) throw() {return(a0);} inline void* operator new [] (size_t,void* a0) throw() {return(a0);} inline void* operator new (size_t r0) throw() {return(MALLOC(r0));} inline void* operator new [] (size_t r0) throw() {return(MALLOC(r0));} inline void operator delete (void*,void*) {return;} inline void operator delete [] (void*,void*) {return;} inline void operator delete (void* a0) {FREE(a0);return;} inline void operator delete [] (void* a0) {FREE(a0);return;}
2。指针的重释
源码:
#ifndef AEE_SIMULATOR template inline T reinterpret_brew (const void* a0) {return(T(a0));} template inline T static_brew (const void* a0) {return(T(a0));} template inline T dynamic_brew (const void* a0) {return(T(a0));} template inline T const_brew (const void* a0) {return(T(a0));} #else #define reinterpret_brew reinterpret_cast #define static_brew static_cast #define dynamic_brew dynamic_cast #define const_brew const_cast #endif
3.平台调用我们的Applet的入口
必须使用extern "C"来定义,不要告诉我,你不晓得是浪咯会事哈
源码:
//入口 extern "C" { int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj) { *ppObj = NULL; if(ClsId == AEECLSID_TJAPP) { if(AEEApplet_New(sizeof(CTJApp), ClsId, pIShell,po,(IApplet**)ppObj, (AEEHANDLER)CTJApp::HandleEvent,(PFNFREEAPPDATA)CTJApp::freeAppData)) { if(CTJApp::initAppData((IApplet *) *ppObj)) { return (AEE_SUCCESS); } } } return (EFAILED); } }
4。实现C到C++的转换
定义3个静态函数,
源码:
static boolean HandleEvent(CTJApp * pApp, AEEEvent eCode, uint16 wparam, uint32 dwParam); static boolean initAppData(IApplet * pIApplet); static void freeAppData(CTJApp * pApp);
事件转发,转换到C++
源码:
boolean CTJApp::HandleEvent(CTJApp * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam) { if( eCode == EVT_KEY && wParam == AVK_FA_F2 ) wParam = AVK_FA_SELECT; return pi->OnEvent(eCode, wParam, dwParam); }
其他的结构模式都是按照 MediaPlay 来处理的。MediaPlay是经典之作哈
大部分程序的结构都是来自它的。
5。新建一个窗口
准备好了哇,先定义窗口值,继承一个class CTJWin
实现class CTJWin 的虚函数,虚函数哈哈,我喜欢虚函数
源码:
virtual boolean OnInit(CTJApp* pApp){return TRUE;} virtual void OnEnable(boolean bEnable=TRUE){} virtual void OnRedraw(){} virtual boolean OnHandleEvent(AEEEvent eCode, uint16 wParam, uint32 dwParam){return TRUE;} virtual boolean OnNotify(int nNotify){return TRUE;}//需要数据通报,请覆盖此函数
然后在相应的函数里实现自己需要的功能。
我已经在CTJWin里面写好一些常用的函数,绝对无木马,欢迎广大群众放心使用,一切后果自负哈,嘿嘿
里面实现了,对话框和基本的标题,按钮,和窗口切换
源码:
static void CloseMsg(CTJWin* pWin);//自动消失的对话框的关闭函数 void ShowMsg();//显示对话框 void SetMsg(uint16 nMsgID,MSG_TYPE nMT = MT_1000 );//2种方式 void SetMsg(AECHAR *psz,MSG_TYPE nMT = MT_1000 ); boolean IsActive();//窗口是否活动 void DrawTitle(boolean bCenter = TRUE);//画标题 void DrawTitle(AECHAR* psz,boolean bCenter = TRUE); void DrawTitleBar(AEERect * pRect, AECHAR* psTextBuf,RGBVAL Background, RGBVAL Text, boolean bCenter); void DrawTTB(); //Text TB void DrawTB(); void DrawToolbar(AEERect * pRect, uint16 nResID, boolean bLeft); void DrawTextTB(AEERect * pRect,uint16 nTextResID,boolean bLeft); void DrawTTBText(AEERect * pRect, AECHAR* psTextBuf,RGBVAL Text, boolean bLeft); void LoadTitle(); void LoadTitle(uint16); void SetTitle(AECHAR*); public: boolean OnNumKey(IMenuCtl* pMenu,uint16 key); boolean PostEvent(AEEEvent evt,uint16 wp,uint32 dwp); boolean GoWin(TPWindow tpwin);//切换窗口 boolean GoBackWin();//回到上一个窗口 void ClearScreen();//清屏 TPWindow GetTPActive();//当前窗口的值 TPWindow GetTPBack();//上次窗口的值得
还有就看看大家有没时间来补充了哈。
6。例子:CSplashWin,启动程序的闪屏窗口
要求:
初始的时候提取一个图片资源
重绘的时候显示一个图片
对键盘的处理任意键跳过,切换到主窗口
对窗口Enable 和 Disable 的处理(来电和短信)
定时结束,切换到主窗口
销毁窗口的时候,释放图片资源,释放定时器
源码:
#include "TJWin.h" class CSplashWin : public CTJWin { public: CSplashWin(); virtual ~CSplashWin(); boolean OnInit(CTJApp* pApp); void OnEnable(boolean bEnable=TRUE); void OnRedraw(); boolean OnHandleEvent(AEEEvent eCode, uint16 wParam, uint32 dwParam); static void CloseSplash(CSplashWin* pSlashWin);//定时器函数, IImage * pi;//启动画面画图片 };
实现具体的功能
源码:
CSplashWin::CSplashWin() { } CSplashWin::~CSplashWin() { //销毁窗口的时候,释放图片资源,释放定时器 ISHELL_CancelTimer(m_pIShell, (PFNNOTIFY)CSplashWin::CloseSplash, this); FA_RELEASEIF(pi); } boolean CSplashWin::OnInit(CTJApp* pApp) { //初始的时候提取一个图片资源 pi = ISHELL_LoadResImage(m_pIShell, TJAPP_RES_FILE, IDB_SPLASH); return TRUE; } void CSplashWin::CloseSplash(CSplashWin* pSlashWin) { //定时结束,切换到主窗口 pSlashWin->m_pApp->SetWindow(FAW_MAIN); } void CSplashWin::OnEnable(boolean bEnable) { //对窗口Enable 和 Disable 的处理(来电和短信) if( bEnable) { ISHELL_SetTimer(m_pIShell, FA_SPLASH_TIMER , (PFNNOTIFY)CSplashWin::CloseSplash, this); } else { ISHELL_CancelTimer(m_pIShell, (PFNNOTIFY)CSplashWin::CloseSplash, this); } } void CSplashWin::OnRedraw() { //重绘的时候显示一个图片 if (pi) { FA_DrawImage(pi, &m_pApp->m_rect, TRUE); } } boolean CSplashWin::OnHandleEvent(AEEEvent eCode, uint16 wParam, uint32 dwParam) { //对键盘的处理任意键跳过,切换到主窗口 if( eCode == EVT_KEY) { m_pApp->SetWindow(FAW_MAIN); } return TRUE; }
在开发当中,在逐渐建立自己的C++开发库,比如CTJMenuo(菜单) ,CSTWin(文本) 都是从CTJWin的基础上建立起来的,
不断的丰富CTJWin的功能函数,在以后的开发中提高效率和健壮性。以上还望大家指点,以达抛砖引玉。
唐建
2004/09/24