⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cppapp.cpp

📁 用C++进行BREW环境开发下的很好的一个实例。非常适用于初学者。
💻 CPP
字号:

#include "CPPAPP.h"
#include "cppapp.bid"
#include "cppapp_res.h"
#include <AEEStdLib.h>

extern "C" {
	int AEEClsCreateInstance(AEECLSID clsID, IShell* pIShell, IModule* pIModule, void **ppobj)
	{
		if(clsID == AEECLSID_CPPAPP)
		{/* 这里的CPPApp应该是类似于MFC中的CWinApp类(应用程序主体)
		    但是比 CWinApp弱多了,CWinApp是从 CWinThread 继承下来的,有一些先天具来的功能
			而这里的CPPApp 就是光屁股了
			-----------------------------------
			上面的想法不对:
			CWinApp 是应用程序类,提供的接口主要有:
			   virtual BOOL InitApplication();
			   virtual BOOL InitInstance();
 			   virtual int Run();

			而这里的 CPPApp 提供的接口有:
			   static boolean  InitAppData(IApplet *pIApplet)    <-- 就这个还比较像一点
			   static void	    FreeAppData(CPPApp * pCPPApp)    
			   static boolean  HandleEvent()					 <-- 这个就一点不象了,还是像
			   传统的 sdk 程序中的 WndProc 程序,用 switch/case 来对应消息和处理函数,或者是像MFC中的 DefWindowProc()函数(用了 MESSAGE MAP的机制)

             MFC程序在开始的地方定义了一个全局的对象(Application Object),执行完必要的构造函数以后,
			 WinMain()登场,登场后调用 InitApplication() 和 InitInstance() 以及 Run()
			 相当于 CWinApp::InitApplication();  <-- 注册窗口类             -》在brew中好像没有windows下的类的窗口类,而是子窗口的概念
			        CMyWinApp::InitInstance();   <-- 产生窗口,显示窗口     -》在brew中是通过响应 EVT_APP_START 画出来的窗口
					CWinApp::Run();              <-- 获取消息并分派消息(获取的消息好像是从消息队列里取出来的)     
					                             接上 -》在brew中不知道消息是怎么获得的,分派是通过HandleEvent()函数
		    

			 比较关键的操作在 CMyWinApp::InitInstance() 中,如下:
			 BOOL CMyWinApp::InitInstance()
			 {
				  m_pMainWnd = new CMyFrameWnd();         <-- 执行 CMyFrameWnd 的构造函数,转了一大圈产生出了窗口
				  m_pMainWnd->ShowWindow(m_nCmdShow);     <-- 令窗口显示出来       
				  m_pMainWnd->UpdateWindow();             <-- 送出去 WM_PAINT 消息
				  return TRUE;		   
			 }
			 这部分的操作实际相当于BREW中的,显示窗口然后更新屏幕 <-- ISHELL_CreateInstance 产生窗口,(设定属性) IDISPLAY_Update()刷新屏幕

             MFC中送出 WM_PAINT 消息以后,执行 系统自动加入的WinMain() 函数中 Run() <--发送消息队列中的 WM_PAINT消息,然后依照 MESSAGE MAP
			 分发找到相应的处理函数并且处理消息。
		   */
			if(!AEEApplet_New(sizeof(CPPApp), clsID, pIShell, pIModule, (IApplet**)ppobj,(AEEHANDLER)CPPApp::HandleEvent,
				(PFNFREEAPPDATA)CPPApp::FreeAppData))
				return EFAILED;

			if (!CPPApp::InitAppData((IApplet *)*ppobj))
				return EFAILED;

			return SUCCESS;
		}
		return EFAILED;
	}
} //extern "C"

boolean  CPPApp::InitAppData(IApplet *pIApplet)
{
	CPPApp* pCPPApp = (CPPApp*)pIApplet;
	
	return pCPPApp->OnAppInitData();
}

void  CPPApp::FreeAppData(CPPApp *pCPPApp)
{
	pCPPApp->OnAppFreeData();
}

boolean  CPPApp::HandleEvent(CPPApp *pCPPApp, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{   
	return pCPPApp->OnEvent(eCode, wParam, dwParam);
}

// 比较奇怪,在这里居然不能执行操作,在MFC的框架中应该执行的是生成FrameWnd的对象
/*
说明这个执行初始化的函数和MFC中的应用类所对应的 InitInstance 是有区别的
*/
boolean CPPApp::OnAppInitData()            // 做初始化工作|分配必须的内存
{
	this->m_strHello = (AECHAR*)MALLOC(16*sizeof(AECHAR));
	// Show_HelloWorld();  
    return TRUE;
}

void CPPApp::OnAppFreeData()
{
	FREE(this->m_strHello);
}

boolean CPPApp::OnEvent(AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
	switch (eCode) 
	{
	    case EVT_APP_START:	
			Show_HelloWorld();
			return(TRUE);
	    
	    case EVT_APP_STOP:
		    return(TRUE);
			
		default:
		    return(FALSE);	   
	}
}

void CPPApp::Show_HelloWorld(){
	IShell *pIShell = this->m_pIShell;
	IDisplay *pIDisplay = this->m_pIDisplay;
	ISHELL_LoadResString(pIShell, CPPAPP_RES_FILE, STR_HELLO, m_strHello, 32);
	IDISPLAY_ClearScreen(pIDisplay);
	IDISPLAY_DrawText(pIDisplay, AEE_FONT_NORMAL, m_strHello, -1, 0, 50, NULL, IDF_ALIGN_CENTER);
	IDISPLAY_Update(pIDisplay);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -