• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評論-2670  文章-0  trackbacks-0
                GacUI的所有列表控件都支持虛擬模式。虛擬模式是一種不需要為每一個列表項分配內(nèi)存的一種顯示方法。在開始的時候,需要高速列表一共有多少個列表項。之后,列表控件在渲染的時候,會跟數(shù)據(jù)源要求獲取某一個下標(biāo)所包含的數(shù)據(jù),并且在這個數(shù)據(jù)一直處于屏幕上的時候,只會跟數(shù)據(jù)源獲取一次。完整的代碼可以在http://www.gaclib.net/Demos/Controls.ListBox.VirtualMode/Demo.html看到。先上圖:



                先看創(chuàng)建界面的代碼。一般來說,所有可以隨著窗口的變化自動排版的控件組織方法,都是使用一個或多個GuiTableComposition來實現(xiàn)的。

            class VirtualModeWindow : public GuiWindow
            {
            private:
                GuiVirtualTextList
            *                    listBox;
                GuiButton
            *                            buttonIncrease;
                GuiButton
            *                            buttonDecrease;
                DataSource
            *                            dataSource;
                
                
            void buttonIncrease_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
                {
                    dataSource
            ->SetCount(dataSource->Count()+100000);
                }

                
            void buttonDecrease_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
                {
                    dataSource
            ->SetCount(dataSource->Count()-100000);
                }
            public:
                VirtualModeWindow()
                    :GuiWindow(GetCurrentTheme()
            ->CreateWindowStyle())
                {
                    
            this->SetText(L"Controls.ListBox.VirtualMode");

                    GuiTableComposition
            * table=new GuiTableComposition;
                    table
            ->SetRowsAndColumns(32);
                    table
            ->SetCellPadding(3);
                    table
            ->SetAlignmentToParent(Margin(0000));

                    table
            ->SetRowOption(0, GuiCellOption::MinSizeOption());
                    table
            ->SetRowOption(1, GuiCellOption::MinSizeOption());
                    table
            ->SetRowOption(2, GuiCellOption::PercentageOption(1.0));

                    table
            ->SetColumnOption(0, GuiCellOption::PercentageOption(1.0));
                    table
            ->SetColumnOption(1, GuiCellOption::MinSizeOption());

                    
            this->GetContainerComposition()->AddChild(table);
                    
                    {
                        GuiCellComposition
            * cell=new GuiCellComposition;
                        table
            ->AddChild(cell);
                        cell
            ->SetSite(0031);

                        dataSource
            =new DataSource;
                        listBox
            =new GuiVirtualTextList(GetCurrentTheme()->CreateTextListStyle(), GetCurrentTheme()->CreateTextListItemStyle(), dataSource);
                        listBox
            ->GetBoundsComposition()->SetAlignmentToParent(Margin(0000));
                        listBox
            ->SetHorizontalAlwaysVisible(false);
                        cell
            ->AddChild(listBox->GetBoundsComposition());
                    }
                    {
                        GuiCellComposition
            * cell=new GuiCellComposition;
                        table
            ->AddChild(cell);
                        cell
            ->SetSite(0111);

                        buttonIncrease
            =g::NewButton();
                        buttonIncrease
            ->SetText(L"Increase 100000 Items");
                        buttonIncrease
            ->GetBoundsComposition()->SetAlignmentToParent(Margin(0000));
                        buttonIncrease
            ->Clicked.AttachMethod(this&VirtualModeWindow::buttonIncrease_Clicked);
                        cell
            ->AddChild(buttonIncrease->GetBoundsComposition());
                    }
                    {
                        GuiCellComposition
            * cell=new GuiCellComposition;
                        table
            ->AddChild(cell);
                        cell
            ->SetSite(1111);

                        buttonDecrease
            =g::NewButton();
                        buttonDecrease
            ->SetText(L"Decrease 100000 Items");
                        buttonDecrease
            ->GetBoundsComposition()->SetAlignmentToParent(Margin(0000));
                        buttonDecrease
            ->Clicked.AttachMethod(this&VirtualModeWindow::buttonDecrease_Clicked);
                        cell
            ->AddChild(buttonDecrease->GetBoundsComposition());
                    }

                    
            // set the preferred minimum client size
                    this->GetBoundsComposition()->SetPreferredMinSize(Size(480480));
                    
            // call this to calculate the size immediately if any indirect content in the table changes
                    
            // so that the window can calcaulte its correct size before calling the MoveToScreenCenter()
                    this->ForceCalculateSizeImmediately();
                    
            // move to the screen center
                    this->MoveToScreenCenter();
                }
            };

                GuiVirtualTextList就是只有虛擬模式的GuiTextList。事實上GuiVirtualTextList是GuiTextList的基類,而GuiTextList.GetItems()返回的對象也是一個數(shù)據(jù)源。因此非虛擬模式其實也是通過虛擬模式來實現(xiàn)的。在數(shù)據(jù)比較少的時候,非虛擬模式操作起來十分的簡單,而在數(shù)據(jù)比較多的時候,虛擬模式可以帶來很好的性能。上面的代碼創(chuàng)建了一個DataSource類來做數(shù)據(jù)源,并且有一個SetCount的函數(shù)用來更改列表里面的數(shù)量的總量,然后每一個列表項的內(nèi)容都是Item xxx。這是怎么做到的呢?我們來看數(shù)據(jù)源的代碼:

            class DataSource : public list::ItemProviderBase, private list::TextItemStyleProvider::ITextItemView
            {
            protected:
                
            int                count;
            public:
                DataSource()
                    :count(
            100000)
                {
                }

                
            void SetCount(int newCount)
                {
                    
            if(0<=newCount)
                    {
                        
            int oldCount=count;
                        count
            =newCount;
                            
                        
            // this->InvokeOnItemModified(affected-items-start, affected-items-count, new-items-count);
                        
            // this function notifies the list control to update it's content and scroll bars
                        if(oldCount<newCount)
                        {
                            
            // insert
                            this->InvokeOnItemModified(oldCount, 0, newCount-oldCount);
                        }
                        
            else if(oldCount>newCount)
                        {
                            
            // delete
                            this->InvokeOnItemModified(newCount, oldCount-newCount, 0);
                        }
                    }
                }

                
            // GuiListControl::IItemProvider

                
            int Count()
                {
                    
            return count;
                }

                IDescriptable
            * RequestView(const WString& identifier)
                {
                    
            if(identifier==list::TextItemStyleProvider::ITextItemView::Identifier)
                    {
                        
            return this;
                    }
                    
            else if(identifier==GuiListControl::IItemPrimaryTextView::Identifier)
                    {
                        
            return this;
                    }
                    
            else
                    {
                        
            return 0;
                    }
                }

                
            void ReleaseView(IDescriptable* view)
                {
                }

                
            // list::TextItemStyleProvider::ITextItemView

                WString GetText(
            int itemIndex)
                {
                    
            return L"Item "+itow(itemIndex+1);
                }

                
            bool GetChecked(int itemIndex)
                {
                    
            // DataSource don't support check state
                    return false;
                }

                
            void SetCheckedSilently(int itemIndex, bool value)
                {
                    
            // DataSource don't support check state
                }

                
            // GuiListControl::IItemPrimaryTextView

                WString GetPrimaryTextViewText(
            int itemIndex)
                {
                    
            return GetText(itemIndex+1);
                }

                
            bool ContainsPrimaryText(int itemIndex)
                {
                    
            return true;
                }
            };

                對于GuiVirtualTextList來說,只需要實現(xiàn)vl::presentation::controls::list::TextItemStyleProvider::ITextItemView就可以了。GacUIIncludes.h里面已經(jīng)有了using namespace vl::presentation::controls,所以在這里只需要從list::開始寫。list::TextItemStyleProvider::ITextItemView還要求實現(xiàn)GuiListControl::IItemPrimaryTextView。在目前的GacUI里面,IItemPrimaryTextView是專門為下拉框準(zhǔn)備的。因為下拉框允許接受任何一種列表對象當(dāng)做下拉內(nèi)容,所以GacUI的列表數(shù)據(jù)源默認(rèn)都要求實現(xiàn)IItemPrimaryTextView。

                實現(xiàn)數(shù)據(jù)源的時候,其實并不要求數(shù)據(jù)源類繼承自ITextItemView和IItemPrimaryTextView。因為GacUI都是通過RequestView來獲取一個View的接口指針的,代碼如上。實現(xiàn)這兩個View也很簡單,在這里就不贅述了。

                GuiTextList就介紹到這里了,接下來的幾個Demo都將是關(guān)于ListView的。下一個Demo是ListView山寨Windows 7的資源管理器界面,可以在http://www.gaclib.net/Demos/Controls.ListView.ViewSwitching/Demo.html看到。具體內(nèi)容將在下一篇博客中闡述。
            posted on 2012-05-30 07:19 陳梓瀚(vczh) 閱讀(2482) 評論(1)  編輯 收藏 引用 所屬分類: GacUI

            評論:
            # re: GacUI Demo:列表的虛擬模式,不需要為每一個列表項分配內(nèi)存的一種顯示方法 2012-05-31 04:37 | 空明流轉(zhuǎn)
            師祖威武!帥不忍睹!  回復(fù)  更多評論
              
            色偷偷久久一区二区三区| 久久九九全国免费| 久久久久久伊人高潮影院| 色婷婷狠狠久久综合五月| 久久只这里是精品66| 午夜天堂av天堂久久久| 久久久久人妻精品一区二区三区| 国内精品久久久久伊人av| 久久精品成人国产午夜| 激情综合色综合久久综合| 久久人人添人人爽添人人片牛牛| 欧美精品久久久久久久自慰| 日韩亚洲欧美久久久www综合网| 久久精品免费一区二区三区| 一本大道久久香蕉成人网| 国产人久久人人人人爽| 亚洲精品NV久久久久久久久久| 久久一日本道色综合久久| 欧美午夜精品久久久久久浪潮| 久久99国内精品自在现线| 久久久国产视频| 国产日韩欧美久久| 国产精品久久毛片完整版| 久久亚洲日韩看片无码| 久久av免费天堂小草播放| 久久精品亚洲日本波多野结衣| 四虎久久影院| 国产精品成人99久久久久91gav| 奇米影视7777久久精品| 亚洲欧美成人久久综合中文网 | 欧美日韩精品久久久久| 久久婷婷国产麻豆91天堂| 7777久久久国产精品消防器材| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产精品久久久久天天影视| 久久精品免费一区二区| 久久久WWW成人免费毛片| 久久久精品视频免费观看 | 日韩va亚洲va欧美va久久| 精品人妻伦九区久久AAA片69| 精品久久一区二区三区|