`
yesjavame
  • 浏览: 687177 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Symbian学习笔记(10):使用ListBox

阅读更多
symbian中的ListBox比较复杂也是比较常用的,我只能先从最简单的CAknSingleStyleListBox入手来尝试看看。太复杂的东西不是我这样的新手要立刻去明白的。

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

然后在Container的ConstructL中去创建它:
voidCUniNewsAppContainer::ConstructL(constTRect&aRect)...{
CreateWindowL();

//addyourcodehere...

//constructalistbox
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增加内容:
voidCUniNewsAppContainer::InitListBox(TInttabId)
...{
if(iListBox==NULL)return;


CDesCArray
*list=static_cast<CDesCArray*>(iListBox->Model()->ItemTextArray());
TBuf
<256>str;

list
->Reset();

CUniNewsAppView
*appView=STATIC_CAST(CUniNewsAppUi*,iCoeEnv->AppUi())->iAppView;
RArray
<TNewsContent>*rc=appView->iChannelHandler->GetContents();
for(TInti=0;i<rc->Count();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:
classCCustomListItemDrawer:publicCListItemDrawer
...{
public:
CCustomListItemDrawer(
constCEikTextListBox&aListBox);
~CCustomListItemDrawer();

private:
virtualvoidDrawActualItem(TIntaItemIndex,constTRect&aActualItemRect,
TBoolaItemIsCurrent,TBoolaViewIsEmphasized,TBoolaViewIsDimmed,
TBoolaItemIsSelected)
const;

public:
voidSetIconArray(CArrayPtr<CGulIcon>*aIconArray);
TSizeMaxIconSize()
const;

private:
voidDeleteIconArray();
voidCalculateMaxIconSize();

private:
constCEikTextListBox&iListBox;
CArrayPtr
<CGulIcon>*iIconArray;
TSizeiMaxIconSize;
}
;

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

第二步是作一个自己的ListBox控件:
classCCustomListBox:publicCEikTextListBox
...{
public://constructors
CCustomListBox();
voidConstructL(constCCoeControl*aParent,TIntaFlags=0);

public://fromCEikTextListBox
virtualTKeyResponseOfferKeyEventL(constTKeyEvent&aKeyEvent,
TEventCodeaType);

private://fromCEikTextListBox
virtualvoidCreateItemDrawerL();
}
;

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

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

相关推荐

    MATLAB GUI教学视频7:ListBox的基本用法

    通过学习这个视频教程,你将能够熟练掌握ListBox的基本操作,并能将其应用到实际的MATLAB GUI项目中,提升你的程序交互性和用户体验。记得在实践中不断探索和改进,让自己的MATLAB GUI更加生动、直观。

    VB6.0 ListBox 应用实例

    这个“VB6.0 ListBox 应用实例”显然着重于演示如何将ListBox与其他控件,如ComboBox,进行组合使用,以实现更复杂的用户界面功能。 1. **ListBox基本属性**: - `Items`:存储ListBox中各选项的集合,可以通过它...

    C# ListBox 的使用

    - 添加项:使用`ListBox.Items.Add()`方法向列表框中添加单个项,例如`listBox1.Items.Add("Item1")`。 - 清空列表:调用`ListBox.Items.Clear()`方法可以清空所有项。 - 获取选中项:`ListBox.SelectedItem`返回...

    ListBox使用例子

    本教程将详细介绍ListBox的使用,包括选择、移动等常见功能。 1. **ListBox的基本属性** - `Items`: 这个属性是ListBox的核心,它包含了ListBox中所有的选项。你可以通过添加、删除或修改这个属性中的元素来改变...

    改变控件的背景颜色(LISTBOX)

    JavaFX中,我们可以使用`setBackgroundColor`方法来改变`ListView`的背景,但请注意JavaFX没有`ListBox`,而是使用`ListView`作为等效控件: ```java listView.setStyle("-fx-background-color: lightblue;"); `...

    Delphi ListBox模拟百度搜索下拉框提示效果.rar

    Delphi模拟百度下拉框搜索提示效果,带提示效果 的ListBox下拉框,如测试运行效果所示,光标锁定的地方,若用户需要输入,则会自动下拉匹配输入的内容,程序可能还需要诸多改进,这只是一个雏形。如果你对Delphi中的...

    精彩编程与编程技巧-ListBox项的控制...

    ### 知识点三:使用 SendMessage API 控制 ListBox 的行为 #### SendMessage 函数: - `SendMessage` 是 Windows API 中的一个函数,用于向窗口发送消息并等待响应。 - 在本例中,使用 `SendMessage` 函数来实现 ...

    listBox的使用方法

    ### listBox的使用方法详解 #### 一、ListBox概述 `listBox` 是一种常见的用户界面元素,在多种编程环境中都有应用,例如Windows Forms、WPF等。它主要用于展示一系列选项供用户选择。本文将详细介绍`listBox`的...

    c# 重写的listbox 有比较好看的样式

    在WPF中,我们可以使用`ControlTemplate`来改变ListBox的整体外观。`ControlTemplate`允许我们指定控件的各个部分,如边框、背景、滚动条等,从而实现完全自定义的样式。例如,我们可以通过XAML代码创建一个新的`...

    使用ListBox控件实现简单的餐馆点菜功能.rar

    在Windows Forms或WPF应用程序开发中,ListBox控件是一个常用且功能强大的组件,它允许用户从一系列选项中进行选择。...总之,ListBox控件提供了一个直观且易于使用的界面元素,是实现类似点菜功能的良好起点。

    完美listbox扩展 C#

    开发者可以通过研究源代码学习如何实现这些功能,或者直接在自己的项目中引用和使用这个库,从而提升应用程序的用户体验和功能完整性。 为了充分利用这个扩展,开发者需要具备一定的C#编程基础,理解Windows Forms...

    WPF listBox 漂亮的listBOX

    在Windows Presentation Foundation (WPF) 中,`ListBox`是一个常用的数据展示控件,它允许用户从一系列项目中进行选择。本篇文章将深入探讨如何利用WPF的`ListBox`创建一个美观且功能丰富的用户界面。 首先,`...

    以 Quick Sort 算法将 ListBox 内容排序的范例(3k)

    总的来说,这个范例展示了如何在Delphi环境中使用快速排序算法对ListBox控件中的字符串数据进行排序,提供了源代码实现,方便开发者理解和学习。通过这样的实践,开发者可以深入理解快速排序的工作原理,并将其应用...

    ListBox透明

    为了解决这个问题,我们可以使用GDI(Graphics Device Interface)或者GDI+来绘制ListBox的背景,使其看起来透明。这通常涉及到以下步骤: 1. **自绘ListBox**:重写ListBox的WM_PAINT消息处理函数,不使用默认的...

    在C#中使用ListBox控件实例源码

    ListBox控件是Windows Forms开发中常见的一种用户...通过学习这个实例源码,你可以了解到如何在实际项目中运用ListBox控件,包括如何设置其属性、添加列表项以及处理用户交互。这将有助于提升你的C# WinForms编程技能。

    ListBox控件用法

    ### ListBox控件用法详解:实现数据在两个ListBox间的多条移动 #### 一、概述 在.NET框架中,ListBox是一种常用的用户界面组件,用于显示一个项目列表供用户选择。ListBox支持多种选择模式,其中“Multiple”模式...

    使用数组列表ArrayList填充ListBox

    本篇将详细介绍如何使用ArrayList来填充ListBox,以及相关知识点。 1. ArrayList基本概念: ArrayList是一个非固定大小的数组,它允许在运行时自动调整大小。这意味着你可以随时添加或删除元素,而不用担心容量...

    WPF源码:ListBox演示代码.rar

    **WPF技术详解与ListBox控件的深度剖析** Windows Presentation Foundation(WPF)...通过学习这个示例,开发者能够深入理解`ListBox`的用法,并将其应用到实际的WPF项目中,创建出交互性强、视觉效果丰富的应用程序。

Global site tag (gtag.js) - Google Analytics