UDN-企业互联网技术人气社区

板块导航

浏览  : 1539
回复  : 0

[资源] GacUI Demo:简单文本列表操作

[复制链接]
狂战灬梦舞的头像 楼主
发表于 2015-12-8 11:28:02 | 显示全部楼层 |阅读模式

  GacUI Demo:简单文本列表操作
  
  GacUI在结束了文本框的介绍之后,开始进入列表的介绍。列表内容丰富,包含各种预定义的列表控件、用来显示和操作大量对象的虚拟模式、MVC分离、修改列表样式等内容。今天先从文本列表的简单操作开始。这个Demo展示了如何对列表进行添加和删除。窗口里面有一个列表,然后有添加和删除两个按钮,分别用于把文本框的内容添加到列表内,和删除掉选中的列表项的。在这个Demo里面只允许列表项单选,并且水平滚动条默认不出现。先看图:
1.jpg

   空间如何布局,我就不再赘述了,明显是一个四行三列的表格。代码如下:

  1. #include "..\..\Public\Source\GacUIIncludes.h"
  2. #include <Windows.h>

  3. // for SortedList, CopyFrom and Select
  4. using namespace vl::collections;

  5. int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
  6. {
  7.     return SetupWindowsDirect2DRenderer();
  8. }

  9. class NameEditorWindow : public GuiWindow
  10. {
  11. private:
  12.     GuiTextList*                        listBox;
  13.     GuiSinglelineTextBox*                textBox;
  14.     GuiButton*                            buttonAdd;
  15.     GuiButton*                            buttonRemove;
  16.    
  17.     void buttonAdd_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
  18.     {
  19.         // add the specified name at the end of the list box
  20.         listBox->GetItems().Add(textBox->GetText());
  21.         textBox->SelectAll();
  22.         textBox->SetFocus();
  23.     }

  24.     void buttonRemove_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
  25.     {
  26.         // remove the selected items using item index
  27.         listBox->GetItems().RemoveAt(listBox->GetSelectedItems()[0]);
  28.     }

  29.     void listBox_SelectionChanged(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
  30.     {
  31.         // disable the button if no item is selected
  32.         buttonRemove->SetEnabled(listBox->GetSelectedItems().Count()>0);
  33.     }
  34. public:
  35.     NameEditorWindow()
  36.         :GuiWindow(GetCurrentTheme()->CreateWindowStyle())
  37.     {
  38.         this->SetText(L"Controls.ListBox.NameEditor");

  39.         GuiTableComposition* table=new GuiTableComposition;
  40.         table->SetRowsAndColumns(4, 3);
  41.         table->SetCellPadding(3);
  42.         table->SetAlignmentToParent(Margin(0, 0, 0, 0));

  43.         table->SetRowOption(0, GuiCellOption::MinSizeOption());
  44.         table->SetRowOption(1, GuiCellOption::MinSizeOption());
  45.         table->SetRowOption(2, GuiCellOption::MinSizeOption());
  46.         table->SetRowOption(3, GuiCellOption::PercentageOption(1.0));

  47.         table->SetColumnOption(0, GuiCellOption::PercentageOption(1.0));
  48.         table->SetColumnOption(1, GuiCellOption::MinSizeOption());
  49.         table->SetColumnOption(2, GuiCellOption::MinSizeOption());

  50.         this->GetContainerComposition()->AddChild(table);
  51.         
  52.         {
  53.             GuiCellComposition* cell=new GuiCellComposition;
  54.             table->AddChild(cell);
  55.             cell->SetSite(0, 0, 4, 1);

  56.             listBox=g::NewTextList();
  57.             listBox->GetBoundsComposition()->SetAlignmentToParent(Margin(0, 0, 0, 0));
  58.             listBox->SetHorizontalAlwaysVisible(false);
  59.             listBox->SelectionChanged.AttachMethod(this, &NameEditorWindow::listBox_SelectionChanged);
  60.             cell->AddChild(listBox->GetBoundsComposition());
  61.         }
  62.         {
  63.             GuiCellComposition* cell=new GuiCellComposition;
  64.             table->AddChild(cell);
  65.             cell->SetSite(0, 1, 1, 1);

  66.             GuiLabel* label=g::NewLabel();
  67.             label->SetText(L"Name to add: ");
  68.             label->GetBoundsComposition()->SetAlignmentToParent(Margin(0, -1, 0, 0));
  69.             cell->AddChild(label->GetBoundsComposition());
  70.         }
  71.         {
  72.             GuiCellComposition* cell=new GuiCellComposition;
  73.             table->AddChild(cell);
  74.             cell->SetSite(0, 2, 1, 1);

  75.             textBox=g::NewTextBox();
  76.             textBox->GetBoundsComposition()->SetPreferredMinSize(Size(120, 23));
  77.             textBox->GetBoundsComposition()->SetAlignmentToParent(Margin(0, 0, 0, 0));
  78.             cell->AddChild(textBox->GetBoundsComposition());
  79.         }
  80.         {
  81.             GuiCellComposition* cell=new GuiCellComposition;
  82.             table->AddChild(cell);
  83.             cell->SetSite(1, 1, 1, 2);

  84.             buttonAdd=g::NewButton();
  85.             buttonAdd->SetText(L"Add");
  86.             buttonAdd->GetBoundsComposition()->SetAlignmentToParent(Margin(0, 0, 0, 0));
  87.             buttonAdd->Clicked.AttachMethod(this, &NameEditorWindow::buttonAdd_Clicked);
  88.             cell->AddChild(buttonAdd->GetBoundsComposition());
  89.         }
  90.         {
  91.             GuiCellComposition* cell=new GuiCellComposition;
  92.             table->AddChild(cell);
  93.             cell->SetSite(2, 1, 1, 2);

  94.             buttonRemove=g::NewButton();
  95.             buttonRemove->SetText(L"Delete");
  96.             buttonRemove->SetEnabled(false);
  97.             buttonRemove->GetBoundsComposition()->SetAlignmentToParent(Margin(0, 0, 0, 0));
  98.             buttonRemove->Clicked.AttachMethod(this, &NameEditorWindow::buttonRemove_Clicked);
  99.             cell->AddChild(buttonRemove->GetBoundsComposition());
  100.         }

  101.         // set the preferred minimum client size
  102.         this->GetBoundsComposition()->SetPreferredMinSize(Size(480, 480));
  103.         // call this to calculate the size immediately if any indirect content in the table changes
  104.         // so that the window can calcaulte its correct size before calling the MoveToScreenCenter()
  105.         this->ForceCalculateSizeImmediately();
  106.         // move to the screen center
  107.         this->MoveToScreenCenter();
  108.     }
  109. };

  110. void GuiMain()
  111. {
  112.     GuiWindow* window=new NameEditorWindow;
  113.     GetApplication()->Run(window);
  114.     delete window;
  115. }

  116.     这里需要注意的几点就是,为了实现在列表没有选中内容的时候禁用删除按钮,我们需要监听GuiTextList::SelectionChanged事件。核心的代码就是下面这几行:

  117.     void buttonAdd_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
  118.     {
  119.         // add the specified name at the end of the list box
  120.         listBox->GetItems().Add(textBox->GetText());
  121.         textBox->SelectAll();
  122.         textBox->SetFocus();
  123.     }

  124.     void buttonRemove_Clicked(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
  125.     {
  126.         // remove the selected items using item index
  127.         listBox->GetItems().RemoveAt(listBox->GetSelectedItems()[0]);
  128.     }

  129.     void listBox_SelectionChanged(GuiGraphicsComposition* sender, GuiEventArgs& arguments)
  130.     {
  131.         // disable the button if no item is selected
  132.         buttonRemove->SetEnabled(listBox->GetSelectedItems().Count()>0);
  133.     }
复制代码


  GuiTextList控件的GetItems函数返回所有的列表项。这个对象有Add、Insert、Clear、IndexOf、Remove、RemoveAt、Contains、Count等函数,可以用来操作列表项。GuiTextList还有GetSelectedItems函数(其实是定义在GuiSelectableListControl里面的),可以用来获得所有选中的列表项的下标(从0开始)。每当列表内容被修改的时候,GetSelectedItems的结果就会被自动清空。

   
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部