首 页 | 新 闻 | Symbian | Android| Windows Mobile | J2ME | 下载中心 | 游戏策划招聘与求职 | 购书指南 | 视频教程
您现在的位置: 开发视界 >> Symbian >> Symbian入门 >> 正文
基本程序结构
作者:yangtang…    文章来源:http://blog.csdn.net/    更新时间:2006-6-2 13:20:28

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

相关文章:
在没有ui的程序中捕获所有的key事件
MMI of UIQ (一)
Symbian类里的extension和reserved
Menu中加入水平分隔线
Series 60应用程序开发[问题一] ERROR:failed to find version information for link.exe
在开发过程中本地化UIQ3程序
Symbian应用程序中如何备份和载入
播放WAV文件
 

站点地图 | 加入收藏 | 联系站长 | 广告服务 |
QQ:280529124  Tel:0592-8271361 辽ICP备05021703号