谈谈用C++开发BREW程序[原创]

原创 2004年12月29日 14:42:00

一直是使用的纯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

mac中brew的安装使用及卸载详细教程

brew 又叫Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 只需要一个命令 brew 又叫Homebrew,是Mac OSX上的软件包管理工...
  • yhhwatl
  • yhhwatl
  • 2015年06月02日 21:13
  • 1682

MAC 下用 brew 搭建 PHP 开发环境

Mac下用brew搭建PHP(LNMP/LAMP)开发环境 Mac下搭建lamp开发环境很容易,有xampp和mamp现成的集成环境。但是集成环境对于经常需要自定义一些配置的开发者来说会非常麻烦,而...
  • wo2niliye
  • wo2niliye
  • 2017年04月01日 18:23
  • 7281

mac 利用brew安装php开发环境--apache

mac 利用brew安装php开发环境
  • shichen501
  • shichen501
  • 2016年10月24日 15:06
  • 5359

Mac下使用brew搭建PHP7+nginx+mysql开发环境

由于新换了个macbook,原来的mac上的环境搭建也已经很久没搭建过了,于是重新整理一下搭建过程。 Mac下自带了php,但是最近想新尝试一下php7的相关特性,于是就重新搭建个php吧。mac下...
  • mysteryhaohao
  • mysteryhaohao
  • 2016年08月17日 14:42
  • 5976

面试题-谈谈对java的认识

Java的基本认识 1、基本介绍 Java是一种跨平台的面向对象的开发语言。具有 简单性,面向对象,分布式,解释型,可靠,安全,平台无关,可移植,高性能,多线程,动态性等特点。 2、具体...
  • u011545779
  • u011545779
  • 2014年04月13日 18:39
  • 2031

mac下homebrew的使用

mac下homebrew的使用 更好排版:https://zybuluo.com/phper/note/87055 mac系统也是基于unix的系统,所以也继承类很多unix的特性,包括软件的编...
  • yangyi2083334
  • yangyi2083334
  • 2015年04月15日 16:38
  • 1245

手把手教你玩转QQ的原创表情

QQ的原创表情非常的可爱,做得比较精致,深受广大QQ用户的喜爱;但怎么将这些表情保存下来,好让我可以在别的地方用呢? 乖乖牛在线将从不同的视角,为你解析QQ原创表情的存储、互通、保护的机制;熟悉了这些...
  • TragicGuy
  • TragicGuy
  • 2015年10月23日 13:58
  • 1091

Mac安装Brew & 如何在mac os中安装gdb及为gdb进行代码签名

Mac安装Brew 安装命令如下: curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/...
  • gdrgn
  • gdrgn
  • 2015年11月22日 12:34
  • 1132

1.2编写C++应用程序&1.3学习桌面应用程序的编程

特此声明:以下内容出自《Visual C++  2013 入门经典》(第七版),我只是摘抄出来。 1.Visual C++可以开发的应用程序有两大类:桌面应用程序和Windows Store 应用程序...
  • xky1306102chenhong
  • xky1306102chenhong
  • 2017年01月17日 15:05
  • 1068

JavaEE 要懂的小事:三、图解Session(会话)

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket ...
  • u010378410
  • u010378410
  • 2015年07月12日 13:25
  • 819
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谈谈用C++开发BREW程序[原创]
举报原因:
原因补充:

(最多只允许输入30个字)