nim_duilib(7)之TreeView
introduction
xml文件添加代码
基于上一篇, 继续向basic.xml中添加下面关于TreeView的代码。 xml完整源码在文末。
<!-- TreeView -->
<TreeView class="list" name="tree" padding="5,3,5,3" margin="20">
</TreeView>
代码中关联
BasicForm.h
- 打开BasicForm.h,类中添加下面的代码用于关联界面控件。
// tree
ui::TreeView *ptree;
BasicForm.cpp
InitWindow函数
- 转到BasicForm.cpp,找到 InitWindow 函数,向其增加下面的代码
void BasicForm::InitWindow()
{
// 6. tree
//----------------------------------------------------------------------------------------
ptree = dynamic_cast<ui::TreeView*>(FindControl(L"tree"));
ui::TreeNode* pparent_node = nullptr;
for (int index = 0; index < 13; ++index)
{
ui::TreeNode* pnode = new(std::nothrow) ui::TreeNode;
if (pnode)
{
// 设置样式
pnode->SetClass(L"listitem");
pnode->SetFixedHeight(20);
if (pparent_node)
{
pnode->SetText(nbase::StringPrintf(L"node %d", index));
pnode->SetMargin({ 10, 0, 0, 0 });
pparent_node->AddChildNode(pnode);
}
else
{
pnode->SetText(nbase::StringPrintf(L"Paren node", index));
ptree->GetRootNode()->AddChildNode(pnode);
pparent_node = pnode;
}
}
else
{
;
}
}
}
运行结果

Note
查看源码发现,TreeView继承ListBox类,且屏蔽了ListBox相关的删除于添加函数:
//以下函数故意私有化,表明禁止使用;应该使用TreeNode中的相关函数
bool Add(Control* pControl) override;
bool AddAt(Control* pControl, std::size_t iIndex) override;
bool Remove(Control* pControl) override;
bool RemoveAt(std::size_t iIndex) override;
void RemoveAll() override;
正如注释所说,TreeView的删除需要使用TreeNode中的相关函数,其中,TreeNode的共有函数:
/// 重写父类方法,提供个性化功能,请参考父类声明
virtual bool IsVisible() const override;
virtual void SetInternVisible(bool bVisible) override;
virtual void SetWindow(Window* pManager, Box* pParent, bool bInit = true) override;
/**
* @brief 子项被点击时触发
* @param[in] param 消息体
* @return 始终返回 true
*/
virtual bool OnClickItem(EventArgs* param);
/**
* @brief 设置子项所属的属性列表容器
* @param[in] pTreeView 容器指针
* @return 无
*/
void SetTreeView(TreeView* pTreeView);
/**
* @brief 获取父节点指针
* @return 返回父节点指针
*/
TreeNode* GetParentNode();
/**
* @brief 设置父节点
* @param[in] pParentTreeNode 父节点指针
* @return 无
*/
void SetParentNode(TreeNode* pParentTreeNode);
/**
* @brief 添加子节点
* @param[in] pTreeNode 子节点指针
* @return 成功返回 true,失败返回 false
*/
bool AddChildNode(TreeNode* pTreeNode);
/**
* @brief 在指定位置添加子节点
* @param[in] pTreeNode 子节点指针
* @param[in] iIndex 要插入哪个位置之后
* @return 成功返回 true,失败返回 false
*/
bool AddChildNodeAt(TreeNode* pTreeNode, std::size_t iIndex);
/**
* @brief 从指定位置移除一个子节点
* @param[in] index 要移除的子节点索引
* @return 成功返回 true,失败返回 false
*/
bool RemoveChildNodeAt(std::size_t index);
/**
* @brief 根据子节点指针移除一个子节点
* @param[in] pTreeNode 子节点指针
* @return 成功返回 true,失败返回 false
*/
bool RemoveChildNode(TreeNode* pTreeNode);
/**
* @brief 移除所有子节点
* @return 无
*/
void RemoveAllChildNode();
/**
* @brief 递归获取所有子节点个数
* @return 返回所有子节点个数
*/
int GetDescendantNodeCount();
/**
* @brief 获取下一级子节点个数
* @return 返回子节点个数
*/
std::size_t GetChildNodeCount();
/**
* @brief 获取一个子节点指针
* @param[in] iIndex 要获取的子节点索引
* @return 返回子节点指针
*/
TreeNode* GetChildNode(std::size_t iIndex);
/**
* @brief 根据子节点指针获取子节点位置索引
* @param[in] pTreeNode 子节点指针
* @return 返回位置索引
*/
int GetChildNodeIndex(TreeNode* pTreeNode);
/**
* @brief 判断是否展开状态
* @return 返回 true 为展开状态,否则为 false
*/
bool IsExpand() const;
/**
* @brief 设置是否展开显示子节点
* @param[in] bExpand 为 true 时展开,为 false 是不展开
* @return 无
*/
void SetExpand(bool bExpand);
/**
* @brief 获取子项层级
* @return 返回当前层级
*/
int GetDepth();
xml完整源码
<?xml version="1.0" encoding="UTF-8"?>
<Window size="800,400" caption="0,0,0,35">
<VBox bkcolor="bk_wnd_darkcolor">
<HBox width="stretch" height="35" bkcolor="bk_wnd_lightcolor">
<Control />
<Button class="btn_wnd_min" name="minbtn" margin="4,6,0,0" />
<Box width="21" margin="4,6,0,0">
<Button class="btn_wnd_max" name="maxbtn"/>
<Button class="btn_wnd_restore" name="restorebtn" visible="false"/>
</Box>
<Button class="btn_wnd_close" name="closebtn" margin="4,6,8,0"/>
</HBox>
<!--下面是中间的控件-->
<VBox padding="30, 30, 30, 30" >
<HBox>
<VBox>
<!-- Buttons -->
<Button class="btn_global_blue_80x30" name="btn_blue" text="blue" />
<Button class="btn_global_white_80x30" name="btn_white" text="white"/>
<Button class="btn_global_red_80x30" name="btn_red" text="red"/>
</VBox>
<!--checkbox-->
<VBox>
<CheckBox class="checkbox_font12" name="checkbox1" text="checkbox1" margin="0,5,0,10" selected="true"/>
<CheckBox class="checkbox_font12" name="checkbox2" text="checkbox2" margin="0,5,0,10"/>
<CheckBox class="checkbox_font12" name="checkbox3" text="checkbox3" margin="0,5,0,10"/>
</VBox>
<!-- option-->
<VBox>
<Option class="circle_option_2" name="option1" group="option_group" text="option1" margin="0,3,0,10" selected="true"/>
<Option class="circle_option_2" name="option2" group="option_group" text="option2" margin="0,3,0,10"/>
<Option class="circle_option_2" name="option3" group="option_group" text="option3" margin="0,3,0,10"/>
</VBox>
<HBox>
<!-- List -->
<VListBox class="list" name="list" padding="5,3,5,3">
</VListBox>
<VBox>
<!-- Buttons -->
<CheckBox class="checkbox_font12" name="list_checkbox_add_to_top" text="add to top" margin="0,5,0,10"/>
<Button class="btn_global_blue_80x30" name="list_btn_add" text="add" />
<CheckBox class="checkbox_font12" name="list_checkbox_remove_all" text="del all?" margin="0,5,0,10"/>
<Button class="btn_global_white_80x30" name="list_btn_remove" text="remove"/>
</VBox>
</HBox>
<!-- TreeView -->
<TreeView class="list" name="tree" padding="5,3,5,3" margin="20">
</TreeView>
</HBox>
</VBox> <!--下面是中间的控件 结束-->
</VBox>
</Window>
nim_duilib(7)之TreeView的更多相关文章
- MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件
类似于多层级的角色与权限控制功能,用MVC实现MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件.最近我们的项目中需要用到树型菜单,以前使用WebForm时,树型菜单有微软提供的 ...
- WPF 自定义列表筛选 自定义TreeView模板 自定义ListBox模板
有很多项目,都有数据筛选的操作.下面提供一个案例,给大家做参考. 左侧是数据源,搜索框加TreeView控件,右侧是ListBox控件.在左侧数据列点击添加数据,然后点击确定,得到所筛选的数据. 下面 ...
- WinForm 进程、线程、TreeView递归加载、发送邮件--2016年12月13日
进程:一个程序就是一个进程,但是也有一个程序需要多个进程来支持的情况 进程要使用的类是:Process它在命名空间:System.Diagnostics; 静态方法Start(); Process.S ...
- wpf TreeView
<Window x:Class="WpfTutorialSamples.TreeView_control.TreeViewDataBindingSample" ...
- 【转载】关于treeview的多层显示的科学用法!
http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-b ...
- winform进程、线程、TreeView递归加载
进程: 一般来说,一个程序就是一个进程,不过也有一个程序需要多个进程支持的情况. 进程所使用的类:Process 所需命名空间:System.Diagnostics; 可以通过进行来开启计算机上现有的 ...
- TreeView 使用方法:(在View.Details模式下)
1.建立TreeView的標題 2.建立TreeView的Item 3.在TreeView的Item中的建立SubItem 如果將各部 ...
- ASP.NET通过递归添加树(Treeview)
先来看看效果,基本上就是这样的. 所谓树,无非就是2点,第一个:根节点,第二:叶子节点,其中叶子节点中还可能有叶子节点,但是根节点始终只有一个. 下面贴上 各部分的代码 1.PAGE_LOAD载入事件 ...
- TreeView控件使用
treeView1.SelectedNode = treeView1.Nodes[0]; //选中当前treeview控件的根节点为当前节点添加子节点: TreeNode tmp; tmp = n ...
随机推荐
- Session和Cookie的原理,以及在分布式应用中出现的问题和解决方案
产生原因 由于http协议是无状态的,同一个浏览器对服务器的两次请求之间是没有关系的,服务器认为两次请求都是全新的请求,不会记住上次请求成功的数据.然而现有的业务常常需要服务器能记住用户的访问情况, ...
- R语言与医学统计图形【4】直方图、金字塔图
R语言基础绘图系统 基础图形--直方图.金字塔图 3.直方图 参数设置及比较. op <- par(mfrow=c(2,3)) data <- rnorm(100,10,5) hist(d ...
- 巩固java第六天
巩固内容: HTML 空元素 没有内容的 HTML 元素被称为空元素.空元素是在开始标签中关闭的. <br> 就是没有关闭标签的空元素(<br> 标签定义换行). 在 XHTM ...
- 日常Java 2021/10/5
java 异常处理 Throwable中包括Error 和Exception,Exception包括IOException和RuntimeException 抛出异常 1.异常运算条件 Arithme ...
- 零基础学习java------30---------wordCount案例(涉及到第三种多线程callable)
知识补充:多线程的第三种方式 来源:http://www.threadworld.cn/archives/39.html 创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnabl ...
- Linux学习 - 条件判断
一.判断格式 test -e /root/install.log 或 [ -e /root/install.log ] 使用echo $?查看是否正确,当返回0时表示返回正确 1 按照文件类型进行判断 ...
- [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解
我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴 ...
- URL+http协议
- iOS UIWebview 长按图片,保存到本地相册
我们所要解决的问题如题目所示:ios中,长按Webview中的图片,将图片保存到本地相册.解决方案:对load的html网页,执行js注入,通过在webview中执行js代码,来响应点击事件,通过js ...
- 【编程思想】【设计模式】【其他模式】graph_search
Python版 https://github.com/faif/python-patterns/blob/master/other/graph_search.py #!/usr/bin/env pyt ...