`
totoxian
  • 浏览: 1074113 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

深入探索Symbian导航面板开发

阅读更多

Author:孙东风

Date:04/08/2008

参考文献:http://www.forum.nokia.com/document/Cpp_Developers_Library/GUID-96C272CA-2BED-4352-AE7C-E692B193EC06/html/Navigation_Pane_API4.html

⒈〖导航面板〗

导航面板由一个Navigation decorators、一个Navigation decorator controls集组成,Navigation decorator control可以是一个label、一个tab group或者一个volume control。导航面板里的控件可以通过Navigation decorators来访问。

这里要说一下decorator这个词的来历,做过Java的程序员都知道,在Java里有个decorator模式,也就是中文的 装饰模式。

这个模式的产生是为了在不改变一个类的代码或不破坏一个类的接口的情况下为该类添加功能,如下:

abtract class Origin{

abtract void OriginInterfOne();

abstract void OriginInterfTwo();

}

那么如果想不改变Origin的代码而又想为该类添加功能就可以采用decorator模式,如下:

public class OriginDecorator implements Origin{

private Origin iOrigin;

public OriginDecorator(Origin aOrigin){

this.iOrigin = aOrigin;

}

public void OriginInterfOne(){

iOrigin.OriginInterfOne();

//Adding other functions.

}

public void OriginInterfTwo(){

iOrigin.OriginInterfTwo();

//Adding other functions.

}

}

那么Nokia借用这个词的用意就很容易知道了,Nokia是想提供这样一个Decorator的接口,那么Users可以在不改变接口的前提下轻松的为Navigation pane添加Navigation decorator controls。

⒉〖访问默认的导航面板控件〗

当使用导航面板的API时,第一步是通过调用CAknAppUi::StatusPane()得到应用程序的状态面板指针。CAknAppUi是application UI的base class,我们知道在EIKON base application中大多数的Ui类都继承自CAknViewAppUi类,而CAknViewAppUi就是继承自CAknAppUi。

当通过CAknAppUi::StatusPane()得到应用程序的状态面板指针后,导航面板就可以被访问。

CAknNavigationControlContainer* iNaviPane;

状态面板的layout是从AVKON资源里读取的,布局资源也包含子面板里面的控件信息。

//Gets a pointer to the status pane

CEikStatusPane* sp = StatusPane();

//Fetch pointer to the default navigation pane control

iNaviPane = (CAknNavigationControlContainer*)sp->Control(TUid::Uid(EEikStatusPaneUidNavi));

⒊〖从资源产生一个带Label控件的导航面板〗

创建导航面板的第一步是定义状态面板和Navigation pane decorator的资源。状态面板的ID和type field值定义在avkon.hrh里。Decorator的resource type被定义成ENaviDecoratorLabel因为Decorator包含一个Label控件。

RESOURCE EIK_APP_INFO
    {
    status_pane = r_app_status_pane;
    }
RESOURCE STATUS_PANE_APP_MODEL r_app_status_pane
    {
    panes=
        {
        SPANE_PANE
            {
            id = EEikStatusPaneUidNavi;
            type = EAknCtNaviPane;
            resource = r_navi_decorator;
            }
        };
    }

RESOURCE NAVI_DECORATOR r_navi_decorator
{
type = ENaviDecoratorLabel;
control = NAVI_LABEL
{
txt="label";
};
}

⒋〖操作Decorator按钮〗

导航面板按钮在导航面板的两端显示为箭头形状,每个按钮的显示可以独立的控制。值得注意的是导航面板按钮默认并不显示出来,如果想显示出来必须调用CAknNavigationDecorator::MakeScrollButtonVisible()函数,想把显示出来的置为不可以见就要调用CAknNavigationDecorator::SetScrollButtonDimmed()函数。

// Set the visibility of the buttons
iDecorator->MakeScrollButtonVisible( ETrue );
// Show the left arrow button
iDecorator->SetScrollButtonDimmed(CAknNavigationDecorator::ELeftButton, EFalse);
// Hide the right arrow button
iDecorator->SetScrollButtonDimmed(CAknNavigationDecorator::ERightButton, ETrue);

⒌〖监听Decorator事件〗

Decorator能发送EAknNaviDecoratorEventRightTabArrow、EAknNaviDecoratorEventLeftTabArrow事件给监听对象。为了处理这两个事件,Decorator的类必须继承自MAknNaviDecoratorObserver并实现HandleNaviDecoratorEventL()方法,这个方法负责处理上述两个事件。

In the example, CMyAppUi observes the decorator events.

class CMyAppUi : public CAknViewAppUi, MAknNaviDecoratorObserver
     {
     // From MAknNaviDecoratorObserver
     void HandleNaviDecoratorEventL( TInt aEventID );
    };

Register this object to decorator, so the object receives events. iDecorator is a pointer to CAknNavigationDecorator.

void CMyAppUi::Construct()
     {
     // Access status pane
     CEikStatusPane* sp = StatusPane();
     // Get a pointer to navi pane
     iNaviPane = (CAknNavigationControlContainer*)sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi));
     // Get a pointer to the decorator created from resource
     iDecorator = iNaviPane->ResourceDecorator();
     // Register this object as an observer of decorator
     iDecorator->SetNaviDecoratorObserver( this );
     }

HandleNaviDecoratorEventL() now can receive decorator events.

void CMyAppUi::HandleNaviDecoratorEventL( TInt aEventID )
     {
     if ( aEventID == EAknNaviDecoratorEventRightTabArrow ) 
          {
           // Do Event handling code here…
          }
     else if (aEventID == EAknNaviDecoratorEventRightTabArrow )
          {
          // Do Event handling code here…          
          }
     }
⒍〖利用导航面板控件栈机制〗
为了让Decorators在导航面板上可见,decorator objects必须放到导航面板的控件栈上并且栈顶的对象显示在导航面板上。
decorators在控件栈上可以进行Pushed、Replaced、Poped操作。如果控件栈里已经有了某个decorator,那么Pushed操作会把这个
decorator置于栈顶而显示在导航面板上。
// Two different decorators are pushed to the control stack
// iDecorator2 will be shown on the navigation pane
iNaviPane->PushL( *iDecorator1 );
iNaviPane->PushL( *iDecorator2 );

// Pushing iDecorator1 again
// iDecorator1 will be shown on the navigation pane
iNaviPane->PushL( *iDecorator1 );

// Pop the topmost opject from the stack ( *iDecorator1 )
// iDecorator2 will be shown on the navigation pane
iNaviPane->Pop( iDecorator1 );

// Replace iDecorator2 with iDecorator3
// iDecorator3 will be shown on the navigation pane
iNaviPane->ReplaceL( *iDecorator2, *iDecorator3 );
⒎〖从资源文件动态创建一个带Label的Decorator〗
RESOURCE NAVI_DECORATOR r_navi_decorator_a
{
type = ENaviDecoratorLabel;
control = NAVI_LABEL
{
txt="label_a";
};
}
导航面板decorator的资源标识被传递给函数CAknNavigationControlContainer::ConstructNavigationDecoratorFromResourceL()。
下面的例子里iDecorator 是一个CAknNavigationDecorator型指针,在资源文件里可以定义多个导航面板decorator,从而程序里面可以动态的从资源文件读取。导航面板decorators的可见性可以用导航面板控件栈来控制。
TResourceReader reader;

// Read the resource
iEikonEnv->CreateResourceReaderLC( reader, R_NAVI_DECORATOR_A );

// Construct the decorator from resource
iDecorator = iNaviPane->ConstructNavigationDecoratorFromResourceL( reader );
// Destroy the object that was put on CleanupStack by
// CreateResourceReaderLC()
CleanupStack::PopAndDestroy();
当然也可以不通过资源文件,在程序里动态的创建导航面板decorators,如下:
// Create the label object
iNaviLabel = new( ELeave ) CAknNaviLabel;
// Set label type and label text
iNaviLabel->SetNaviLabelType( CAknNaviLabel:: ENavigationLabel);
iNaviLabel->SetTextL( _L( "label" ) );

// Create the decorator object with the label
iDecorator = CAknNavigationDecorator::NewL( iNaviPane, iNaviLabel, CAknNavigationDecorator::ENaviLabel );
从资源文件创建的decorators可以通过下面的代码访问:
// Get the decorator constructed from resource
iDecorator = iNaviPane->ResourceDecorator();
那么改变decorators里控件的label可以通过如下方法:
// Get the decorator constructed from resource
iDecorator = iNaviPane->ResourceDecorator();
// Getting the control from the decorator object
iNaviLabel = ( CAknNaviLabel* )iDecorator->DecoratedControl();
// Change text
iNaviLabel->SetTextL( _L( "new label" ) );
而Label里的文本信息可以通过如下方法获得:
// Label text as info message
CEikonEnv::Static()->InfoMsg( *iNaviLabel->Text() );
实际上通过下面的方法可以简单的创建一个带Lable的decorator:
// Create the decorator and the label control

iDecorator = iNaviPane->CreateNavigationLabelL( _L("label") );
分享到:
评论

相关推荐

    在CCoeControl控件中使用导航面板总结

    根据提供的标题、描述以及部分代码内容,我们可以总结出在Symbian系统下的CCoeControl控件中使用导航面板的关键知识点。 ### 在Symbian系统下使用CCoeControl控件中的导航面板 #### 1. 导航面板相关对象定义 在...

    symbian塞班软件开发工程师培训班实施方案.doc

    "Symbian塞班软件开发工程师培训班实施方案" 本文档主要介绍了Symbian塞班软件开发工程师培训班实施方案的整个项目计划,包括市场需求、人才缺口、薪资待遇、认证考试等方面的分析和讨论。 1. 市场需求方面,随着...

    推荐-symbian塞班软件开发工程师培训班实施方案 精品.pdf

    【Symbian塞班软件开发工程师培训班实施方案】 随着信息技术的快速发展,Symbian操作系统作为曾经在智能手机领域的主导者,曾引领了移动开发的热潮。本文将深入探讨Symbian平台的开发现状、ASD(Accredited Symbian...

    塞班系统开发16本电子书合集(高清PDF)

    这个“塞班系统开发16本电子书合集”提供了全面的资源,帮助开发者深入理解和掌握塞班平台的软件开发技术。 这些电子书可能涵盖以下关键知识点: 1. **塞班系统架构**:塞班系统基于微内核设计,具有层次化的结构...

    搭建Symbian开发环境

    要进行Symbian应用开发,首先需要搭建一个完整的开发环境。本篇文章将详细讲解如何搭建Symbian开发环境,特别是针对Symbian S60平台。 **Symbian SDK** Symbian SDK(软件开发套件)是开发者构建Symbian OS应用的...

    Symbian OS C++ 手机应用开发(第一卷,中文版).pdf

    “Symbian OS C++ 手机应用开发(第一卷,中文版)”这本书不仅为初学者提供了系统的学习路径,也为有一定基础的开发者提供了深入探索Symbian OS开发领域的宝贵资源。通过学习本书,读者将能够全面掌握Symbian C++...

    Symbian开发入门.rar

    2. Symbian开发入门第一步 3. S60v1.2 N-GAGE QD 开发环境搭建(VC6版) 4. S60十大优秀软件 5. S60 系统手机类型及所用操作系统 6. S60 和 Symbian OS 的关系 7. S40与S60的区别 8. 诺基亚S60手机隐藏代码 9...

    Symbian系统开发教程(1)

    Symbian系统开发教程主要涵盖了Symbian OS...通过这个教程,开发者将获得编写Symbian OS应用程序的基础知识,包括理解系统特性、选用合适的开发工具以及配置开发环境,从而为深入的Symbian OS应用开发打下坚实的基础。

    symbian_开发环境搭建手册及简单示例

    在本文中,我们将深入探讨Symbian操作系统下的开发环境搭建过程以及如何进行简单的应用程序开发。Symbian操作系统曾经是智能手机领域的主导平台,尤其在功能手机时代,它为开发者提供了广泛的机遇。现在,虽然其市场...

    Qt开发Symbian实例程序

    Qt开发Symbian实例程序是针对诺基亚Symbian操作系统的应用开发,结合了Qt框架的灵活性和Symbian的设备兼容性。Qt是一个跨平台的C++图形用户界面应用程序开发框架,允许开发者在多个操作系统上构建应用程序,包括...

    塞班S60开发流程介绍

    塞班S60开发流程详解 ...总的来说,S60开发需要对C++编程、Symbian操作系统以及Carbide++ IDE有深入理解。通过不断实践和学习,开发者可以逐步掌握S60应用的开发技巧,创造出满足用户需求的软件。

    symbian s60开发环境搭建

    ### Symbian S60开发环境搭建指南 随着智能手机的发展,Symbian系统曾经一度成为市场上最主流的操作系统之一。S60平台是基于Symbian操作系统之上的一种用户界面,被广泛应用于诺基亚等品牌的手机中。对于想要从事...

    Symbian开发简介

    Symbian操作系统是一款专为移动...这些PPT文件对于深入理解和实践Symbian开发至关重要,它们将提供详细的步骤、示例代码和最佳实践。如果你已经获取了这些文件,通过学习和实践,你可以成为一名熟练的Symbian开发者。

    symbian软件开发指南

    《Symbian软件开发指南》是一份详尽的教程,主要涵盖了S60平台的开发准备和编程入门。S60,全称Series 60,是诺基亚基于Symbian操作系统的一个智能手机用户界面,它为开发者提供了丰富的功能和广阔的开发空间。...

    symbian系统开发教程

    symbian系统开发教程.....symbian系统开发教程

    Symbian手机应用开发标准教程的实例源代码

    本教程将聚焦于Symbian手机应用开发,通过一系列实例源代码来深入理解Symbian OS的应用程序设计和实现。 首先,我们需要了解Symbian OS的基本架构。Symbian系统基于微内核设计,具有多任务、实时性和安全性等特点。...

    塞班S60开发流程介绍.pdf

    塞班S60开发流程是针对诺基亚S60平台的应用程序开发步骤,主要涉及安装开发套件、创建和调试项目以及打包安装。以下是对整个流程的详细说明: 1. **安装开发套件** - **Carbide_cpp_v2_0**: 这是Symbian开发的主要...

    基于Symbian OS的手机开发与应用_part1

    《基于Symbian OS的手机开发与应用》pdf电子版,共4个rar,作者:何伟//杨宗德//张兵,本书主要介绍基于Symbian平台的控制台应用程序和GUI应用程序的开发,内容涵盖开发平台的搭建、内存管理、描述符、动态数组、...

Global site tag (gtag.js) - Google Analytics