二、 基本程序结构

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 11:28   14   0

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP