Symbian学习笔记(10)——使用ListBox
创始人
2024-03-25 10:40:18
0
symbian中的ListBox比较复杂也是比较常用的,我只能先从最简单的CAknSingleStyleListBox入手来尝试看看。太复杂的东西不是我这样的新手要立刻去明白的。

  先声明一个列表组件:CAknSingleStyleListBox* iListBox;

  然后在Container的ConstructL中去创建它:

 

void CUniNewsAppContainer::ConstructL(const TRect& aRect) ...{
    CreateWindowL();
   
    //add your code here ...

    //construct a listbox
    iListBox = new(ELeave) CAknSingleStyleListBox
    iListBox->SetContainerWindowL( *this);
    iListBox->SetListBoxObserver(this);
    iListBox->ConstructL(this,EAknListBoxSelectionList|EAknListBoxLoopScrolling);
      
    iListBox->CreateScrollBarFrameL(ETrue);
    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOn,CEikScrollBarFrame::EOn);
    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL(ETrue);
    iListBox->SetRect(aRect);   
   
    SetRect(aRect);
    ActivateL();
}

  这里有几句话,一是SetScrollBarVisibilityL设置使用滚动条,二是ItemDrawer()->ColumData()->EnableMarqueeL()让选中的文本超长后可以左右滚动。

  有一点比较奇怪,我得先设置ListBox的Rect才能设置整个Container的Rect?否则ListBox会不占整个主面板的位置。

  接着在合适的地方需要去给ListBox增加内容:

void CUniNewsAppContainer::InitListBox(TInt tabId)
...{
    if(iListBox==NULL) return;

   
    CDesCArray* list = static_cast( iListBox->Model()->ItemTextArray() );
    TBuf<256> str;
   
    list->Reset();
           
    CUniNewsAppView * appView = STATIC_CAST(CUniNewsAppUi*,iCoeEnv->AppUi())->iAppView;
    RArray* rc = appView->iChannelHandler->GetContents();
    for(TInt i=0;iCount();i++)
    ...{
        if( (*rc)[i].pid==tabId)...{
            str.FillZ(str.MaxLength());
            str.Format(KITEMFORMAT,(*rc)[i].title);
            list->AppendL(str);
        }
    }
      
    iListBox->HandleItemAdditionL();
    iListBox->SetFocus( ETrue );
    iListBox->SetCurrentItemIndexAndDraw(appView->iListIndex);
    iListBox->ActivateL();
   
    iListBox->DrawNow();   
}

  这里的HandleItemAdditionL()通知一下ListBox模型作了增加操作,同样还有一个HandleItemRemovalL()则是通知ListBox作了一个删除操作。

  这里的KITEMFORMAT定义是"\t%S"。这里的格式似乎挺重要的,一般是:图标ID\t题头字串\t主要字串\t图标ID\t图标ID。

  我这里因为没有用到图标所以是一个\t%S,这个\t不可省略。如果用图标,则变成%d\t%S了,同时还要增加iconArray在创建iListBox的时候。

 

CAknIconArray* icons =new(ELeave) CAknIconArray(2);
CleanupStack::PushL(icons);
icons->ConstructFromResourceL(R_ICON_LISTICONS);
iListBox->ItemDrawer()->ColumnData()->SetIconArray(icons);   
CleanupStack::Pop();

  在ListBox中有一个叫Model()的还有一个叫View()的,从名字上就可以看出它们的含义了。前面我们从Model中操作列表内容,而我们可以从View中获取ItemDrawer去操作列表显示

  的一些参数,但是我觉得有一点不爽的是,缺省生成的列表框字体比较大,不是太喜欢,在网上搜了一下,似乎那个设置字体的方法对我的机器不管用?

  iListBox->ItemDrawer()->SetFont(ApacPlain12());

  不过有一种方法是可行的,只是比较麻烦,那就是自己去实现ListBox,以及它的ItemDrawer。在网上看到的代码我试了一下,还行。方法如下。

  第一步作一个自己的ItemDrawer:

 

class CCustomListItemDrawer: public CListItemDrawer
...{
public:
    CCustomListItemDrawer(const CEikTextListBox& aListBox);
    ~CCustomListItemDrawer();

private:
    virtual void DrawActualItem(TInt aItemIndex, const TRect& aActualItemRect,
         TBool aItemIsCurrent, TBool aViewIsEmphasized, TBool aViewIsDimmed,
         TBool aItemIsSelected) const;

public:
    void SetIconArray(CArrayPtr* aIconArray);
    TSize MaxIconSize() const;

private:
    void DeleteIconArray();
    void CalculateMaxIconSize();

private:
    const CEikTextListBox& iListBox;
    CArrayPtr*   iIconArray;
    TSize                  iMaxIconSize;
};

  实现的代码中最重要的就是那个DrawActualItem方法负责具体的绘制工作,从它的参数表中足够得到绘制所需的信息,剩下的事情就是用SystemGc去绘制。

  第二步是作一个自己的ListBox控件:

 

class CCustomListBox: public CEikTextListBox
    ...{
public: // constructors
    CCustomListBox();
    void ConstructL(const CCoeControl* aParent, TInt aFlags = 0);

public: // from CEikTextListBox
    virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,
        TEventCode aType);

private: // from CEikTextListBox
    virtual void CreateItemDrawerL();
    };

  在它的CreateItemDrawerL()中创建成员iItemDrawer = new (ELeave) CCustomListItemDrawer(*this)。而OfferKeyEvent主要的作用是处理上下方向键。

  关于ListBox的使用,可以参考这个地址:http://pagesperso-orange.fr/klisa/3650/ListBox/page01.html

【编辑推荐】

  1. Symbian每6个月发布一款新开源操作系统
  2. 微软建WindowsMarketplace 完善智能机平台
  3. 大力模仿Android 传微软WM6.5可装插件

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...