最新的代碼可以在Vczh Library++3.0(Candidate\GUI\GuiDemo\GuiDemo.sln)中找到,運行結果如圖所示:

這個ComboBox之所以直接跟GuiListControl結合起來,還是歸功于GuiListControl的MVC和virtual mode混合功能的設計。GuiListControl可以自定義數(shù)據(jù)源、數(shù)據(jù)顯示樣式、數(shù)據(jù)排列算法以及坐標軸的。其中數(shù)據(jù)源運行時可修改但是不可直接替換對象。每一種數(shù)據(jù)顯示樣式都可以要求數(shù)據(jù)源提供某種固定格式的View。譬如list::TextItemStyleProvider就要求數(shù)據(jù)源提供list::TextItemStyleProvider::ITextItemView,ListView的六種樣式共享list::ListViewItemStyleProvider::IListViewItemView。如果你需要設計新的view,或者為已知的數(shù)據(jù)源提供view,可以簡單的繼承那個數(shù)據(jù)源類并override它的RequestView和ReleaseView方法。這樣View就成為了數(shù)據(jù)源和數(shù)據(jù)顯示樣式中間的一個媒介。不同的數(shù)據(jù)顯示樣式可以共享View,不同的數(shù)據(jù)源也可以提供相通的View,這樣他們之間的耦合就解除了。用戶可以根據(jù)各自的性能要求來實現(xiàn)View。
舉個例子,你直接從文件讀出來的一個巨大的struct數(shù)組,要求你轉(zhuǎn)換成一個一個的object顯然是太浪費性能了。在這種情況下,你只需要實現(xiàn)一個GuiListControl::IItemProvider并提供具體的View的實現(xiàn),就可以讓列表控件僅僅在需要顯示數(shù)據(jù)的時候,才使用index來向View獲取具體的數(shù)據(jù)內(nèi)容。這可以大大提高性能,而且甚至可以在可能的情況下實現(xiàn)“一邊拖滾動條,一邊異步加載數(shù)據(jù)”這樣的高級操作。
更多的ComboBox樣式會在接下來提供到Demo里面去,可能會有ColorPicker或者FontPicker等等,如果時間充足的話。