二、基本程序结构

来源:互联网 发布:java人事管理系统 编辑:程序博客网 时间:2024/04/30 08:27

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

原创粉丝点击