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

深入理解Symbian控件架构

阅读更多
Symbian中的控件都由CCoeControl派生而来,想定义自身的控件同样也需要继承CCoeControl
这个CCoeControl很有意思,实现(或调用)它的不同方法就会产生不同的名称定义或者说是不同类型,至少在整个应用中开发者对它们的功能定义是如此:
A视图
做为视图也就是说,它在继承CCoeControl之后在进行构造时必须要调有CreateWindowL()创建Window窗口,也就是说这是一个带自身窗体的控件,在此控件上可以在Draw()方法中进行图形绘制动作。
B不拥有窗口控件
它自身并不拥用窗体,它依靠寄宿(视图)窗口来显示(在进行自身构造时不调用CreateWindowL())。
从控件数量级别上分又可发为:
1复合控件(Container)
2.单控件
下面我们从CConeControl提供的方法中来进一步的介绍,并详细的介绍一下里面比较重要的方法,更多时候我们仅能够看到一样code sample.并不了解其中那些方法的作用和使用的必要性。
下面我们介绍一个视图code进行剖析:
在进行代码查看时,我们不必去理会那些无关方法,每个simple里面都有它的一些为了实现某些功能做的一些特殊效果和方法,下面用蓝色标出的是用户不必关心的。
class CIeAppView : public CCoeControl
{
public:
static CIeAppView* NewL(const TRect& aRect,const TInt &aInt,CQikAppUi* aAppUi); //这是同一个c类的二次构造相关的内容
~CIeAppView(); //C类必须的析构函数,在里面将该视图的不可自动消除的成员变量进行释放
void ConstructL(const TRect& aRect,CQikAppUi* aAppUi); //第二阶段的构造,这个里面含有很多比较重要的信息,稍后我会在详细的app中介绍
CIeAppView::CIeAppView(const TInt &aPoint);
TInt iPoint;
TInt iAddInt;
private:
void Draw(const TRect& /* aRect */) const; //CCoeControl提供的draw方法
void FocusChanged(TDrawNow aDrawNow); //触发焦点后调用的方法同样由ccoecontrol提供
// Virtual, defined by CCoeControl; replaces the default implementation
// provided by CCoeControl.
CEikTabButton* iButton; //某非自主窗体的控件
CQikAppUi* iAppUi;
};
下面我们来看一下其cpp的内容:
#include "CIe.h"
下面的这是一个返回CIeAppView指针的方法,它里面使用了两段构造后,返回成功构造的对象指针.
CIeAppView* CIeAppView::NewL(const TRect& aRect,const TInt &aInt,CQikAppUi* aAppUi)
{
CIeAppView* cIe = new(ELeave) CIeAppView(aInt);
CleanupStack::PushL(cIe); //将对象推入清理栈
cIe->ConstructL(aRect,aAppUi);
CleanupStack::Pop(); //清除清理栈
return cIe;
}
void CIeAppView::ConstructL(const TRect& aRect,CQikAppUi* aAppUi)
{
iAppUi = aAppUi;
//通过下面这句为控件创建一个自身的窗体.
CreateWindowL();
//设置绘画的区域,同时它还会调用SizeChanged()方法
SetRect(aRect);
//下面这是一个控件的构造过程
iButton = CEikTabButton::NewL(aRect);
/*
使用AppUi将控件加入事件栈中,使做为寄宿的控件能够获得事件,同样在AppUi的析构函数中要调调用RemoveFromStackL().
*/
iAppUi->AddToStackL(iButton);
//看,下面这句为寄宿控件设置了父窗体
iButton->SetContainerWindowL(*this);
/*
下面这句通知应用一切备好准备进行绘图,当然你也可以覆盖此方法,写入一些在进行draw之前需要准备的工作.
*/
ActivateL();
}
CIeAppView::CIeAppView(const TInt &aPoint)
{
iPoint = aPoint;
}
CIeAppView::~CIeAppView()
{
delete iButton;
}
void CIeAppView:: FocusChanged(TDrawNow aDrawNow)
{
if(IsFocused()){
iButton->SetFocus(ETrue,EDrawNow);
}
}
void CIeAppView::Draw(const TRect& /* aRect */) const
{
CWindowGc& gc = SystemGc();
}
可能,看上面会有点晕,这个成员数据iButton究竟是一个怎样的控件,首先在下面没有进行解释之前,我们讨论一下复合寄宿控件(container)和非复合寄宿控件的概念。
1.复合控件
a)也就是含用一个以上寄宿控件的控件,我们通常称之为container。虽然说我们从表面上看一个控件button加起来很easy,只需要配置一下然后再加入command id就可以,实际上在symbian中也是一个绘图的过程,不过需要我们注意的是container本身不会绘图,具体的绘图由下面的子控件的draw来完成。
做为复合控件必须要改写CConeControl中的两个方法
TInt CountComponentControls() const; //返回子控件个数
CCoeControl* ComponentControls(Tint aIndex) const;//按控件索引返回复合控件中的某一控件指针.
b)container的寄宿控件同复合控件相反,它不用去改写上面的两个方法,更多的用处是在自身的draw方法中下功夫.
class CEikTabButton:public CCoeControl
{
public:
static CEikTabButton* NewL(const TRect aRect);
void ConstructL(const TRect aRect);
~CEikTabButton();
private:
TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
void Draw(const TRect& aRect) const;
void FocusChanged(TDrawNow aDrawNow);
voidSizeChanged();
/*
Tint CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
*/
CFbsBitmap* iButtonImg;
TRect iSmileyRect;
CEikLabel* iLabel;
};
#include "CIE.h"
CEikTabButton* CEikTabButton::NewL(const TRect aRect)
{
CEikTabButton* aButton = new(ELeave) CEikTabButton();
CleanupStack::PushL(aButton);
aButton->ConstructL(aRect);
CleanupStack::Pop(aButton);
return aButton;
}
void CEikTabButton::ConstructL(const TRect aRect)
{
//CreateWindowL();
iButtonImg =new (ELeave) CFbsBitmap();
_LIT(aPath,"Z:\\system\\apps\\cie\\cie.mbm");
iButtonImg->Load(aPath,EMbmCieA,ETrue);
//iLabel = new(ELeave) CEikLabel();
//iLabel->SetContainerWindowL(*this);
//ActivateL();
SetRect(TRect(0,0,40,40));
}
CEikTabButton::~CEikTabButton()
{
delete iButtonImg;
//delete iLabel;
}
void CEikTabButton::SizeChanged()
{
/*iSmileyRect=Rect();
// Allow room for the focus rectangle round the outside
iSmileyRect.Shrink(3,3);
iSmileyRect.SetRect(iSmileyRect.iTl+TPoint(100/4, 100/2),TSize(100/2, 100/3));
iSmileyRect.SetRect(iSmileyRect.iTl+TPoint(100/4, 100*2/3),TSize(100/2, 100/3));
*/
}
TKeyResponse CEikTabButton::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
{
iEikonEnv->InfoMsg(_L("A"));
}
void CEikTabButton::Draw(const TRect& aRect) const
{
CWindowGc& gc=SystemGc();
gc.Clear(Rect());
gc.SetClippingRect(Rect());
gc.DrawBitmap(Rect(),iButtonImg);
}
void CEikTabButton::FocusChanged(TDrawNow aDrawNow)
{
if(aDrawNow)
{
DrawNow();
}
}
至此,寄宿控件可以正常显示在appview中了。稍后,我们介绍如何让这些寄宿控件能够获得事件.
分享到:
评论

相关推荐

    深入理解Symbian控件架构.txt

    ### 深入理解Symbian控件架构 在探讨Symbian系统的控件架构时,我们首先要明确几个核心概念,这些概念对于理解和设计Symbian应用界面至关重要。本篇文章将详细解读Symbian控件架构的核心内容,并通过具体代码示例来...

    Symbian应用程序架构 总结

    本文将深入探讨Symbian应用程序的基础架构,包括核心应用程序类、应用程序初始化过程以及重要的AppUi方法,同时会提及常见的Symbian应用程序架构类型。 首先,核心应用程序类是所有S60 UI应用程序的基础。这些类...

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

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

    Symbian经典入门代码

    1. **Symbian系统架构** Symbian操作系统采用微内核设计,由一系列服务、库和应用程序组成。其核心包括内存管理、进程和线程调度、网络支持以及硬件抽象层等关键组件。初学者应了解这些基础,以便更好地理解代码...

    symbian_sample.rar_DEMO_塞班

    通过深入学习和实践这些DEMO,开发者可以逐步提升在塞班平台上的编程能力,理解其系统架构和特性,为开发更复杂的应用打下坚实基础。不过,要注意的是,随着移动操作系统的发展,塞班已不再是主流,但对于历史研究和...

    symbian 新手入门 中文版

    5. **用户界面设计**:了解Symbian的UI设计原则和控件,如何创建响应式、用户友好的界面。Symbian UI基于Series 60平台,学习其控件和布局规则对于开发美观的应用至关重要。 6. **文件系统和数据管理**:Symbian的...

    symbian 小知识

    Symbian是一个经典的移动操作系统,尤其在智能手机早期广泛使用。对于初学者来说,理解Symbian的UI程序框架和开发基础...通过深入理解和实践,初学者可以逐步掌握Symbian开发的基本技能,为更复杂的项目打下坚实基础。

    s60下一个Grid控件的实用实例

    通过分析和学习这个例子,你可以深入理解如何在实际项目中使用Grid控件,以及如何处理各种交互和界面更新。 总的来说,S60第二版的Grid控件是一个强大而灵活的工具,可以帮助开发者创建出富有吸引力和交互性的用户...

    symbian万年历代码

    通过学习和分析"XHCalendar"的源代码,开发者不仅可以掌握Symbian应用开发的基本技巧,还能深入理解日期处理算法和用户界面设计。这个项目对于任何希望进入移动平台开发领域的程序员来说,都是一个有价值的实践案例...

    symbian源代码

    1. **Symbian OS架构**:了解其微内核、层次化结构以及对并发和内存管理的独特设计。 2. **活动对象(Active Objects)**:学习如何创建、调度和管理活动对象,理解它们如何处理异步事件。 3. **时间服务**:熟悉...

    The.Symbian.OS.Architecture.Sourcebook

    无论是对于希望了解Symbian OS内部工作机制的技术人员,还是对于研究移动操作系统发展的学者来说,本书都是一本不可多得的参考书。通过对本书的学习,读者不仅能掌握Symbian OS的核心技术要点,还能从中汲取到宝贵的...

    智能手机操作系统编程Symbian及60系列

    《智能手机操作系统编程Symbian及60系列》是一本深入探讨Symbian操作系统及其60系列平台的专著。Symbian系统曾是早期智能手机市场...对于历史爱好者和移动技术研究者来说,这本书无疑是深入了解Symbian世界的一把钥匙。

    SymbianOSC++.zip_Symbian OS_symbian_symbian 源码

    Symbian OS以其微内核架构、高效的内存管理以及对多任务的支持,吸引了众多开发者进行移动应用开发。 在压缩包中,有一个名为"www.pudn.com.txt"的文件,这可能是一个链接到更多资源或者提供下载信息的文本文件。...

    Symbian开发讲义

    通过这份讲义,读者可以深入理解Symbian系统的基本架构、开发环境以及应用程序的创建过程。 Symbian操作系统采用微内核设计,具有高效内存管理和多任务处理能力。它的核心组件包括操作系统内核、设备驱动、中间件...

    北京邮电大学symbian课件

    通过这些课件,学习者可以系统地了解和掌握Symbian操作系统的基础知识,包括编程、内存管理、GUI设计、网络通信等方面,从而具备开发Symbian应用的能力。尽管Symbian已不再是当前市场的主流,但其背后的原理和实践...

    Symbian入门与环境配置

    ### Symbian入门与环境配置 #### 一、开发入门 ...通过学习这些知识点,开发者不仅能够了解Symbian操作系统的架构和开发环境,还能够掌握基本的开发技巧,从而为更高级的应用开发打下坚实的基础。

    Symbian开发有用的例子

    在移动操作系统的历史上...同时,理解Symbian的API和系统架构对于解决特定问题和优化性能也很有帮助。随着技术的不断发展,虽然Symbian系统的市场份额已不如从前,但其设计理念和开发经验仍然对现代移动开发有所启示。

    Series 60应用程序开发(symbian).rar

    Series 60应用程序开发是针对Symbian操作系统的一个重要主题,尤其对于移动设备开发者来说,这是一个深入理解Symbian OS并构建用户界面的关键领域。Symbian操作系统曾是智能手机市场的主导平台,尤其在诺基亚手机中...

    Symbian OS C++手机应用开发 第三卷

    6. **文件系统与存储管理**:了解Symbian的文件系统结构,如何读写文件,以及如何有效地管理设备存储空间,是构建需要持久化数据的应用程序所必需的。 7. **网络通信**:Symbian OS提供了丰富的网络API,用于实现...

Global site tag (gtag.js) - Google Analytics