原帖地址 http://blog.csdn.net/sharetop/archive/2008/03/12/2173005.aspx 来自颜承的blog
自己随手转一个 方便以后查阅
开发symbian的GUI应用是有模板的,用Carbide C++的工程向导可以自动生成程序的基本框架。不过可能与安装的SDK版本有关,我现在只能生成一个AppUi一个Container的常规模板(以前用2nd FP3时还可以生成多个view多个container的视图模板)。
不管是哪一种模板,它们共同的部分是入口函数、Application和Document。即以下三个文件是所有工程都具有的:
1)有一个与工程同名的cpp文件,它只提供了两个全局函数,是程序执行的入口,负责创造Application。这个文件我们不用管它。
2)有一个以工程名+Application命名的类,派生于CAknApplication,它负责创建文档类并提供应用的UID。一般情况下它也不需要我们操心,但是因为它提供了一个函数OpenIniFileLC,如果我们需要在启动程序时加载ini文件中的配置,可以重载它。
3)有一个以工程名+Document命名的类,派生于CAknDocument,它负责创建Ui类,同样一般情况我们不管它,但是它也提供了一个函数OpenFileL,如果需要加载普通文件,也可以重载它。
下面来看看两种模板的不同点吧。
一. 基于CCoeControl的常规模式
这种模式的特点是一个AppUi类并且对应一个Container类。
它在上述三个文件以外,还有下面两个文件:
4)有一个以工程名+AppUi命名的类,派生于CAknAppUi,它主要的工作是负责用户接口(所谓的UI)并且创建Container类,所以它是我们关注的重点之一。
它最重要的成员函数是HandleCommandL,这个函数来自于CEikAppUi类,负责处理各种命名/事件。
有两个函数DynInitMenuBarL和DynInitMenuPaneL,如果需要动态更改菜单的项目,可以重载它们。
HandleKeyEventL函数则可以在需要自己处理键盘事件时重载一下。
此外,这个AppUi还提供一些比较常用的函数,比如:
Document() 可以获取Document对象指针。
Application() 可以获取Application对象指针。
StatusPane() 可以获取状态栏的指针。
Cba() 可以获取控制栏的指针。
5)有一个以工程名+Container命名的类,派生于CCoeControl,它负责内容的展示,也是我们关注的重点。
如果需要在界面上增加控件类类的东西,都是在这个类中实现,总的来说,它负责所有与界面展示相关的东西。
它有一个Draw函数,但是如果我们是通过控件来展示信息,则这个函数里的代码似乎与我们关系不大,除非我们的界面完全是靠画出来的。
另两个函数ComponentControl和CountComponentControls分别获取控件与获取控件个数,在依赖于控件展示的GUI应用中则更为重要。
因为它实现了接口MCoeControlObserver,所以函数HandleControlEventL也需要实现一下。
利用它的成员iCoeEnv可以取到AppUi类的指针,不过需要强制转型一下,如:STATIC_CAST(CiMusicAppUi*,iCoeEnv->AppUi())->...
二. 基于CAknView的MVC模式
这种模式的特点是在AppUi类与Container类之间增加一个AppView的类,即一个AppUi对象,N个AppView和N个Container。
除了公共的三个文件以外,它包括的文件有:
4) 有一个以工程名+AppUi命名的类,派生于CAknViewAppUi类,其实也是间接派生于CAknAppUi类,它的工作职责与常规模式中的AppUi类也基本相同。
唯一的区别在于它不是直接创建Container类,而是创建AppView类,并且是创建多个AppView类。同时它还需要负责将创建的view加入视图栈里AddViewL。