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
分享到:
相关推荐
通过学习这个视频教程,你将能够熟练掌握ListBox的基本操作,并能将其应用到实际的MATLAB GUI项目中,提升你的程序交互性和用户体验。记得在实践中不断探索和改进,让自己的MATLAB GUI更加生动、直观。
这个“VB6.0 ListBox 应用实例”显然着重于演示如何将ListBox与其他控件,如ComboBox,进行组合使用,以实现更复杂的用户界面功能。 1. **ListBox基本属性**: - `Items`:存储ListBox中各选项的集合,可以通过它...
- 添加项:使用`ListBox.Items.Add()`方法向列表框中添加单个项,例如`listBox1.Items.Add("Item1")`。 - 清空列表:调用`ListBox.Items.Clear()`方法可以清空所有项。 - 获取选中项:`ListBox.SelectedItem`返回...
本教程将详细介绍ListBox的使用,包括选择、移动等常见功能。 1. **ListBox的基本属性** - `Items`: 这个属性是ListBox的核心,它包含了ListBox中所有的选项。你可以通过添加、删除或修改这个属性中的元素来改变...
JavaFX中,我们可以使用`setBackgroundColor`方法来改变`ListView`的背景,但请注意JavaFX没有`ListBox`,而是使用`ListView`作为等效控件: ```java listView.setStyle("-fx-background-color: lightblue;"); `...
Delphi模拟百度下拉框搜索提示效果,带提示效果 的ListBox下拉框,如测试运行效果所示,光标锁定的地方,若用户需要输入,则会自动下拉匹配输入的内容,程序可能还需要诸多改进,这只是一个雏形。如果你对Delphi中的...
### 知识点三:使用 SendMessage API 控制 ListBox 的行为 #### SendMessage 函数: - `SendMessage` 是 Windows API 中的一个函数,用于向窗口发送消息并等待响应。 - 在本例中,使用 `SendMessage` 函数来实现 ...
### listBox的使用方法详解 #### 一、ListBox概述 `listBox` 是一种常见的用户界面元素,在多种编程环境中都有应用,例如Windows Forms、WPF等。它主要用于展示一系列选项供用户选择。本文将详细介绍`listBox`的...
在WPF中,我们可以使用`ControlTemplate`来改变ListBox的整体外观。`ControlTemplate`允许我们指定控件的各个部分,如边框、背景、滚动条等,从而实现完全自定义的样式。例如,我们可以通过XAML代码创建一个新的`...
在Windows Forms或WPF应用程序开发中,ListBox控件是一个常用且功能强大的组件,它允许用户从一系列选项中进行选择。...总之,ListBox控件提供了一个直观且易于使用的界面元素,是实现类似点菜功能的良好起点。
开发者可以通过研究源代码学习如何实现这些功能,或者直接在自己的项目中引用和使用这个库,从而提升应用程序的用户体验和功能完整性。 为了充分利用这个扩展,开发者需要具备一定的C#编程基础,理解Windows Forms...
在Windows Presentation Foundation (WPF) 中,`ListBox`是一个常用的数据展示控件,它允许用户从一系列项目中进行选择。本篇文章将深入探讨如何利用WPF的`ListBox`创建一个美观且功能丰富的用户界面。 首先,`...
总的来说,这个范例展示了如何在Delphi环境中使用快速排序算法对ListBox控件中的字符串数据进行排序,提供了源代码实现,方便开发者理解和学习。通过这样的实践,开发者可以深入理解快速排序的工作原理,并将其应用...
为了解决这个问题,我们可以使用GDI(Graphics Device Interface)或者GDI+来绘制ListBox的背景,使其看起来透明。这通常涉及到以下步骤: 1. **自绘ListBox**:重写ListBox的WM_PAINT消息处理函数,不使用默认的...
ListBox控件是Windows Forms开发中常见的一种用户...通过学习这个实例源码,你可以了解到如何在实际项目中运用ListBox控件,包括如何设置其属性、添加列表项以及处理用户交互。这将有助于提升你的C# WinForms编程技能。
### ListBox控件用法详解:实现数据在两个ListBox间的多条移动 #### 一、概述 在.NET框架中,ListBox是一种常用的用户界面组件,用于显示一个项目列表供用户选择。ListBox支持多种选择模式,其中“Multiple”模式...
本篇将详细介绍如何使用ArrayList来填充ListBox,以及相关知识点。 1. ArrayList基本概念: ArrayList是一个非固定大小的数组,它允许在运行时自动调整大小。这意味着你可以随时添加或删除元素,而不用担心容量...
**WPF技术详解与ListBox控件的深度剖析** Windows Presentation Foundation(WPF)...通过学习这个示例,开发者能够深入理解`ListBox`的用法,并将其应用到实际的WPF项目中,创建出交互性强、视觉效果丰富的应用程序。