📄 cppapp.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 + -