GacUI今天完成了可自定义格式的ComboBox。ComboBox分为两种,一种是空空如也全部要自己做的只提供下拉功能的GuiComboBoxBase,另一种是在构造函数接受一个GuiSelectableListControl从而自动将列表与ComboBox关联起来的GuiComboBoxListControl。因为列表控件是MVC和virtual mode的混合体,所以如果要自动把列表的文本显示到ComboBox上面去的话,那么加进去的基类为GuiSelectableListControl(预定义的所有列表控件的基类都是这个,包括TreeView)所提供的ItemProvider必须实现一个GuiListControl::IItemPrimaryTextView的View。当然,没有这个View也可以,因为ComboBox同时也可以让你自定义“选中列表”的显示方法——不一定非的是一个字符串,也可以是图片啊色块什么的。
最新的代码可以在
Vczh Library++3.0(Candidate\GUI\GuiDemo\GuiDemo.sln)中找到,运行结果如图所示:
这个ComboBox之所以直接跟GuiListControl结合起来,还是归功于GuiListControl的MVC和virtual mode混合功能的设计。GuiListControl可以自定义数据源、数据显示样式、数据排列算法以及坐标轴的。其中数据源运行时可修改但是不可直接替换对象。每一种数据显示样式都可以要求数据源提供某种固定格式的View。譬如list::TextItemStyleProvider就要求数据源提供list::TextItemStyleProvider::ITextItemView,ListView的六种样式共享list::ListViewItemStyleProvider::IListViewItemView。如果你需要设计新的view,或者为已知的数据源提供view,可以简单的继承那个数据源类并override它的RequestView和ReleaseView方法。这样View就成为了数据源和数据显示样式中间的一个媒介。不同的数据显示样式可以共享View,不同的数据源也可以提供相通的View,这样他们之间的耦合就解除了。用户可以根据各自的性能要求来实现View。
举个例子,你直接从文件读出来的一个巨大的struct数组,要求你转换成一个一个的object显然是太浪费性能了。在这种情况下,你只需要实现一个GuiListControl::IItemProvider并提供具体的View的实现,就可以让列表控件仅仅在需要显示数据的时候,才使用index来向View获取具体的数据内容。这可以大大提高性能,而且甚至可以在可能的情况下实现“一边拖滚动条,一边异步加载数据”这样的高级操作。
更多的ComboBox样式会在接下来提供到Demo里面去,可能会有ColorPicker或者FontPicker等等,如果时间充足的话。
posted on 2012-01-04 06:24
陈梓瀚(vczh) 阅读(2574)
评论(8) 编辑 收藏 引用 所属分类:
GacUI