introduction

  • 更多控件用法,请参考 here 和 源码。
  • 本文的代码基于这里

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的更多相关文章

  1. MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件

    类似于多层级的角色与权限控制功能,用MVC实现MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件.最近我们的项目中需要用到树型菜单,以前使用WebForm时,树型菜单有微软提供的 ...

  2. WPF 自定义列表筛选 自定义TreeView模板 自定义ListBox模板

    有很多项目,都有数据筛选的操作.下面提供一个案例,给大家做参考. 左侧是数据源,搜索框加TreeView控件,右侧是ListBox控件.在左侧数据列点击添加数据,然后点击确定,得到所筛选的数据. 下面 ...

  3. WinForm 进程、线程、TreeView递归加载、发送邮件--2016年12月13日

    进程:一个程序就是一个进程,但是也有一个程序需要多个进程来支持的情况 进程要使用的类是:Process它在命名空间:System.Diagnostics; 静态方法Start(); Process.S ...

  4. wpf TreeView

    <Window x:Class="WpfTutorialSamples.TreeView_control.TreeViewDataBindingSample"        ...

  5. 【转载】关于treeview的多层显示的科学用法!

    http://blogs.msdn.com/b/mikehillberg/archive/2009/10/30/treeview-and-hierarchicaldatatemplate-step-b ...

  6. winform进程、线程、TreeView递归加载

    进程: 一般来说,一个程序就是一个进程,不过也有一个程序需要多个进程支持的情况. 进程所使用的类:Process 所需命名空间:System.Diagnostics; 可以通过进行来开启计算机上现有的 ...

  7. TreeView 使用方法:(在View.Details模式下)

    1.建立TreeView的標題         2.建立TreeView的Item         3.在TreeView的Item中的建立SubItem                  如果將各部 ...

  8. ASP.NET通过递归添加树(Treeview)

    先来看看效果,基本上就是这样的. 所谓树,无非就是2点,第一个:根节点,第二:叶子节点,其中叶子节点中还可能有叶子节点,但是根节点始终只有一个. 下面贴上 各部分的代码 1.PAGE_LOAD载入事件 ...

  9. TreeView控件使用

    treeView1.SelectedNode = treeView1.Nodes[0];  //选中当前treeview控件的根节点为当前节点添加子节点:  TreeNode tmp; tmp = n ...

随机推荐

  1. awk多文件处理时的分隔符?

    目录 问题来源 解决方法 问题来源 我有两个文件,一个是plink过滤后得到的.fam文件(空格分隔):另一个是样本对应关系文件(tab分隔). 文件1: 文件2: 两个文件匹配,awk常规操作.这里 ...

  2. python8 标准模块和第三方模块

  3. 使用SpringBoot实现登录注册的几个问题

    一.用户名密码都正确的情况下被登录拦截器拦截 控制台报错:org.apache.ibatis.executor.ExecutorException: A query was run and no Re ...

  4. 以VuePress的v1.x为基础开发-用户手册

    首先配置.vuepress中的config.js module.exports = { title:"用户手册", description: '用户手册', evergreen: ...

  5. 利用抖音Cookie充值接口提取支付链接,个人调起原生微信h5支付宝h5支付

    最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本. 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了. 这次要分享的是利用抖音的充值接口,去分 ...

  6. 学习java的第二十一天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  7. 学习java第十九天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  8. Scala(五)【集合的高级使用】

    目录 一.集合属性 size length contains mkString 二.集合方法 drop.dropRight distinct:去重 head.last:获取第一个.最后一个元素 tai ...

  9. Shell学习(八)——dd命令

    一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...

  10. Oracle中的索引

    1.Oracle 索引简介      在Oracle数据库中,存储的每一行数据都有一个rowID来标识.当Oracle中存储着大量的数据时,意味着有大量的rowID,此时想要快速定位指定的rowID, ...