上次只是简单的说明了GUI程序的结构,没有深入到具体代码和程序流程。本篇将深入介绍。
hellogui包含以下文件:
-
Hellogui.cpp DLL 入口点
-
HelloguiAppliction.cpp 创建新的Document,定义应用程序UID
HelloguiAppliction.h
-
HelloguiDocument.cpp 代表文件中的数据,创建AppUI
HelloguiDocument.h
-
HelloguiAppUi.cpp 处理所有菜单命令
HelloguiAppUi.h
-
HelloguiAppView.cpp 在屏幕上显示数据
HelloguiAppView.h
程序流程
-
应用程序启动,框架装载hellogui.app,并且调用函数E32Dll
-
框架调用函数NewApplication,创建类HelloguiAppliction的实例,并且返回实例的指针。接着框架使用这个指针完成应用程序的创建
-
框架调用函数AppDllUid得到该程序的UID。此举的作用是判断该程序的实例是否已经运行,如果是,就不用新建一个该程序的实例,而是激活它
-
框架调用HelloguiAppliction的成员函数CreateDocumentL,创建一个类HelloguiDocument的一个实例并返回实例的指针。这样框架可以直接调用对象HelloguiDocument方法
-
框架再次调用AppDllUid,判断是否需要从文件系统装载文件,当然hellogui不用装载任何文件
-
框架调用对象HelloguiDocument的方法CreateAppUi,创建一个HelloguiAppUi对象,并返回指向它的指针
-
框架分别调用对象HelloguiAppUi的constructor和ConstructL方法
-
方法ConstructL首先调用基类的BaseConstructL来读取程序相关的资源文件
-
AppUi 调用NewL创建HelloguiAppView。这里不再是框架调用
-
框架调用Draw绘图
-
无论何时用户选择了菜单,框架将调用HandleCommandL处理命令
还有一些是需要注意的:
-
创建Application对象时使用的不是通常的New(ELeave),而是普通的New。这是因为这里该程序的TRAP harness还没有创建。如果无法分配内存,框架将处理
-
Application对象、Document对象、AppUi对象都是通过框架销毁。框架包含了这些对象的指针
-
Draw方法只能由框架调用。当程序启动、菜单消失、程序激活时框架自动调用Draw方法。如果程序员想要重绘屏幕,应该调用DrawNow方法
-
Draw方法不可以异常退出。因为这个函数是直接由框架调用的,框架并不知道如何处理可能的错误。所以Draw方法必须TRAP并处理可能的错误
-
如果程序需要响应按键,AddTostackL方法必须被AppUi对象的ConstructL调用。此举将App View加入控件栈
-
All resource instances should be defined in lowercase in the RSS file.When referring to them from source code, however, they should be upper case.
hellogui虽然简单,但它是其它GUI程序的基础。在它的基础上很容易扩展成复杂的应用程序。