1、一个symbian OS GUI应用程序,必须实现四个类:
·应用程序类:应用程序类用于定义应用程序的属性,还用于生成新的空白文档。传递UID信息。
·文档类:表示应用程序的数据模式。负责保存和恢复应用程序的数据,创建应用程序的用户UI接口
·应用程序UI接口类:该类是完全不可见的,他创建一个应用程序视图,并且处理菜单等32位命令的响应手段。
·应用程序视图类:这是一个具体的控件类。他的目的是在屏幕上显示应用程序数据,并允许用户交互。
2、从helloworld开始理解symbian:
工程文件
|
Example Applications >> helloworldbasic.mmp |
helloworldbasic.mmp
/* Copyright (c) 2004, Nokia. All rights reserved */
TARGET HelloWorldBasic.app
TARGETTYPE app
// Change the second number here to change the UID for this application
UID 0x100039CE 0x10005B91
TARGETPATH \system\apps\helloworldbasic
SOURCEPATH ..\src
SOURCE HelloWorldBasic.cpp
SOURCE HelloWorldBasicApplication.cpp
SOURCE HelloWorldBasicAppView.cpp
SOURCE HelloWorldBasicAppUi.cpp
SOURCE HelloWorldBasicDocument.cpp
SOURCEPATH ..\data
RESOURCE HelloWorldBasic.rss //菜单,字符串,数组等资源
RESOURCE HelloWorldBasic_caption.rss //主要是程序显示的标题和名称
USERINCLUDE ..\inc //用户头文件目录
SYSTEMINCLUDE \epoc32\include //系统头文件目录
LIBRARY euser.lib
LIBRARY apparc.lib
LIBRARY cone.lib
LIBRARY eikcore.lib
LIBRARY avkon.lib
LIBRARY commonengine.lib
LANG SC
AIF HelloWorldBasic.aif ..\aif HelloworldBasicAif.rss c12 qgn_menu_demo_cxt.bmp qgn_menu_demo_cxt_mask.bmp qgn_menu_demo_lst.bmp qgn_menu_demo_lst_mask.bmp
// End of File
====================================
TARGET HelloWorldBasic.app 代表生成的目标
TARGETTYPE app 代表生成类型
UID:每个程序必须有自己唯一的UID。如果要发表软件,必须获得UID。可以发email:uid@symbiandevnet.com ,标题为“UID request”,写明将请求多少个UID(第一次请求8个比较合理)在24小时内,将获得全球唯一的UID号码。
DLL启动代码:
|
Example Applications >> Hello World Basic Example |
/* Copyright (c) 2002, Nokia. All rights reserved */
#include "HelloWorldApplication.h"
// DLL entry point, return that everything is ok
GLDEF_C TInt E32Dll(TDllReason /*aReason*/)
{
return KErrNone;
}
// Create an application, and return a pointer to it
EXPORT_C CApaApplication* NewApplication()
{
return (new CHelloWorldApplication);
}
NewApplication()是一个应用程序的建构类,通过他返回应用程序类。E32Dll()是一个例行公事的函数。只要每次照样宣称就可以了。他调用了DLL的入口。
应用程序类
|
Example Applications >> Hello World Basic Example |
/* Copyright (c) 2002, Nokia. All rights reserved */
#ifndef __HELLOWORLD_APPLICATION_H__
#define __HELLOWORLD_APPLICATION_H__
#include <aknapp.h>
class CHelloWorldApplication : public CAknApplication
{
public: // from CAknApplication
TUid AppDllUid() const;//传递UID信息
protected: // from CAknApplication
CApaDocument* CreateDocumentL();//创建了默认文档类
};
#endif // __HELLOWORLD_APPLICATION_H__ 这个类主要完成了两件事情: (1)他传递了应用程序功能的一些信息,包括其UID。这个验证会作为最后对DLL完整性的检查。
(2)充当了文档生成器。
文档类
#ifndef __HELLOWORLD_DOCUMENT_H__
#define __HELLOWORLD_DOCUMENT_H__
#include <akndoc.h>
// Forward references
class CHelloWorldAppUi;//类的向前使用,这种手法注意学习
class CEikApplication;
class CHelloWorldDocument : public CAknDocument
{
public:
static CHelloWorldDocument* NewL(CEikApplication& aApp); //用于二阶段构造
static CHelloWorldDocument* NewLC(CEikApplication& aApp);//用于二阶段构造
~CHelloWorldDocument();
public: // from CAknDocument
CEikAppUi* CreateAppUiL();//创造应用程序UI类
private:
void ConstructL();//用于二阶段构造
CHelloWorldDocument(CEikApplication& aApp);//自身构造函数
};
#endif // __HELLOWORLD_DOCUMENT_H__
文档类是真正开始有实际意义的代码。这个例子由于没有涉及文件的操作,所以仍然显得多余。但是以后我们会发现,这种分类是非常巧妙的。
应用程序类
|
Example Applications >> Hello World Basic Example |
#ifndef __HELLOWORLD_APPUI_H__
#define __HELLOWORLD_APPUI_H__
#include <aknappui.h>
// Forward reference
class CHelloWorldAppView;
class CHelloWorldAppUi : public CAknAppUi
{
public:
void ConstructL();//二阶段构造之用
CHelloWorldAppUi();
~CHelloWorldAppUi();
public: // from CAknAppUi
void HandleCommandL(TInt aCommand);//接受32位命令ID,并分配相对应操作。
private:
CHelloWorldAppView* iAppView;
};
#endif // __HELLOWORLD_APPUI_H__
对应的CPP文件下有:
// handle any menu commands
void CHelloWorldAppUi::HandleCommandL(TInt aCommand)
{
switch(aCommand)
{
case EEikCmdExit:
case EAknSoftkeyExit:
Exit();
break;
case EHelloWorldCommand1:
{
_LIT(message,"Hello!");
CAknInformationNote* informationNote = new (ELeave) CAknInformationNote;
informationNote->ExecuteLD(message);
}
break;
default:
Panic(EHelloWorldBasicUi);//相当于忽略,什么也不做。
break;
}
}
=========================================
现在看看这个命令ID是在哪里定义的?
命令常量首先要在*.hrh中定义:
enum THelloWorldBasicIds
{
EHelloWorldBasicCommand1 = 1 // start value must not be 0
};
*.rss中定义:
RESOURCE MENU_BAR r_helloworldbasic_menubar
{
titles =
{
MENU_TITLE { menu_pane = r_helloworldbasic_menu; }
};
}
//定义子级目录:
RESOURCE MENU_PANE r_helloworldbasic_menu
{
items =
{
MENU_ITEM
{
command = EHelloWorldBasicCommand1;
txt = qtn_hewb_command1;
},
MENU_ITEM
{
command = EAknSoftkeyExit;
txt = qtn_hewb_exit;
}
};
}
关于字符串的预定义在helloworldbasic.loc中。
现在我们来理解一下helloworldbasic.rss:
|
Series 60 2nd Edition SDK for Symbian OS, Supporting Feature Pack 2 Example Applications >> Hello World Basic Example |
/* Copyright (c) 2002, Nokia. All rights reserved */
NAME HELL //资源的ID。在一个项目内保证无重复名称
#include <eikon.rh>//必须的一些内部结构和常量的定义
#include <eikon.rsg>//必须的一些内部结构和常量的定义
#include <avkon.rh>//必须的一些内部结构和常量的定义
#include <avkon.rsg>//必须的一些内部结构和常量的定义
#include "HelloWorld.hrh"//自定义的一些内部结构和常量的定义
// ---------------------------------------------------------
// 以下两个不许在任何程序中做任何修改
// This resource should be empty.
RESOURCE RSS_SIGNATURE { }
// Default Document Name
RESOURCE TBUF r_default_document_name { buf=""; }
// ---------------------------------------------------------
//标识菜单和快捷键的资源ID
RESOURCE EIK_APP_INFO
{
menubar = r_helloworld_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_EXIT;
}
// ---------------------------------------------------------
// 定义菜单
RESOURCE MENU_BAR r_helloworld_menubar
{
titles =
{
MENU_TITLE {menu_pane = r_helloworld_menu;}
};
}
// ---------------------------------------------------------
// 定义子菜单
RESOURCE MENU_PANE r_helloworld_menu
{
items =
{
MENU_ITEM {command = EHelloWorldCommand1; txt = "Hello";},
MENU_ITEM {command = EAknSoftkeyExit; txt = "Exit";}
};
}
/*定义了字符串资源。虽然这里是小写。但是在程序中引用时必须全部大写。这个和symbian的编译器相关。他把rss的资源串编译到<SDK_installation_directory>\include路径下,成为rsg文件。而CPP实际上#include的是这个rsg文件。*/
RESOURCE TBUF32 r_hewb_command1_text { buf=qtn_hewb_command1_text; }
RESOURCE TBUF32 r_hewb_caption_string { buf=qtn_hewb_caption_string; }
// End of File |