一直是使用的纯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
本文地址:http://com.8s8s.com/it/it33133.htm