大隐于市

用艺术的眼光看待编程!

孙东风ID:dongfengsun
131329次访问,排名611好友5人,关注者31
03年从西安交通大学毕业后一直从事移动平台的开发工作。崇尚一切自由的东西,热爱交流。目前专注于手机二维码技术研究并负责技术管理工作,希望能和同行认识、交流、共享。
dongfengsun的文章
原创 73 篇
翻译 2 篇
转载 32 篇
评论 151 篇
孙东风的公告
原创文章转载请注明出处
QQ :372590353
MSN:sundongfeng1227@hotmail.com
  我的EMAIL



最近评论
j7fs:我也正在学习这方面的知识,希望能得到你的指点,
我的邮箱是:j7fs_cn@163.com,望能得到一份源码以便学习之用,谢谢:)
gjprgj:能否列几本书看看?新手,多指教:)
gjprgj:能不能给列几本书看看啊?新手,多指教。
gjprgj:能不能给列几本书看看啊?新手,多指教。
fig_o:就下载了某大师的VC++视频资料
请问在哪里下载。地址给一个
文章分类
收藏
    相册
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 深入探索Symbian多视图程序开发收藏

    新一篇: 深入探索Symbian活动对象开发 | 旧一篇: Symbian开发之Debug功能模块

    Author:孙东风

    Date:04/01/2008

            我们知道,在大多数GUI的Applications中,视图之间的切换是极其频繁的。那么如何组织这些视图以及视图之间的通讯,就成为大多数Applications所要面对的问题。

    在Symbian中多视图应用程序之间的视图管理可以用下图来表示:

    其中AppUI管理AppView,而AppView又管理Container。

    AppUI继承自CAknViewAppUi,其管理AppView的代码如下:

    CAppView1* iView1 = new(ELeave) CAppView1;
    CleanupStack::PushL( iView1 );
    videoView->ConstructL();
    AddViewL( iView1 );
    CleanupStack::Pop();// view1

    CAppView2* iView2 = new(ELeave) CAppView2;
    CleanupStack::PushL( iView2 );
    userView->ConstructL();
    AddViewL( iView2);
    CleanupStack::Pop();// view2

    SetDefaultViewL(*iView1);

    而其中每个View又继承自

    class CAppView1: public CAknView , public MCoeControlObserver

    class CAppView2: public CAknView , public MCoeControlObserver

    View之间要想实现自由的切换,就必须定义一个TUid作为自身的唯一标识并实现CAknView的方法

    // UID of view
    const TUid KViewId = {1};     

    /**
    * From CAknView returns Uid of View
    * @return TUid uid of the view
    */
    TUid Id() const;

    那么从一个View跳转到另一个View就需要下面的代码

    ((CAknViewAppUi*)(iEikonEnv->AppUi()))->ActivateLocalViewL( TUid::Uid( 3 ));或

    static_cast<CApplicationAppUi*>(iEikonEnv->AppUi())->ActivateLocalViewL( TUid::Uid( 3 ));

     

            上面的代码讲述了AppUI如何管理众多的View以及View之间的切换,那么下面讲述每个View是如何管理它里面众多的Containers的。

            首先要明白View继承自CAknView,它做为Container(继承自CCoeControl)的容器通过以下的代码激活某个Container

    iContainer = new (ELeave) CApplicationContainerSetting;       
    iContainer->ConstructL( KFullScreen );
    iContainer->SetMopParent(this);
    iContainer->SetObserver(this);
    iContainer->SetApplicationDbEngine(iDbEngine);
    AppUi()->AddToStackL( *this, iContainer );

            那么在DoActivateL()中通过以上代码放置初始显示的Container。

    那么View是如何管理众多的Container的呢?

    从以上代码可以看出,负责Container管理的View都继承自MCoeControlObserver,而iContainer->SetObserver(this)则把当前的Container注册到MCoeControlObserver,从而实现了View对其内部Container的监听。

    View中继承自MCoeControlObserver的接口void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType)则负责每个Container所报告的事件的处理。

    注意:如果View中并没Container,那么就没必要继承自MCoeControlObserver。

    而Container继承自CCoeControl(它是HandleControlEventL的一个参数),CCoeControl中提供下面的方法对View中的HandleControlEventL()报告事件。

      case EStdKeyDevice1: //右键
      {
       ReportEventL((MCoeControlObserver::TCoeEvent)ECmdDeleteVideoContainer);
       break;
      }

    而View通过以下方法对上面代码所报告的事件进行处理。

    void CAppView1::HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType)
    {
     switch(aEventType)
     {

    case EMenuItemCmdBack:
      {
       ((CAVASAppUi*)(iEikonEnv->AppUi()))->HandleCommandL(EEikCmdExit);
       break;
      }
    case ECmdDeleteVideoContainer:
      {
       break;
      }
    default:
      break;
     }
    }

    从上面的分析可以看出:

    AppView通过继承自CAknView并通过ActivateLocalViewL()切换视图。

    而AppView通过继承自MCoeControlObserver监听众多的Container,并在HandleControlEventL()里对Container所报告的事件进行响应。

     

    发表于 @ 2008年04月01日 00:46:00|评论(loading...)|编辑

    新一篇: 深入探索Symbian活动对象开发 | 旧一篇: Symbian开发之Debug功能模块

    评论

    #oyq_yangy 发表于2008-04-01 17:05:29  IP: 211.94.155.*
    我看行,就是离深入探索还差点,并且应该是针对s60的。别忘了还有uiq呢。
    #benq998 发表于2008-04-09 15:28:31  IP: 221.130.39.*
    我认为其实s60和uiq的差别不太大,看这些代码基本也就知道uiq的用法了。
    #bluepac 发表于2008-04-26 20:32:02  IP: 61.171.117.*
    只是讲了如何使用...
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 孙东风