nim_duilib(7)之TreeView

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>

posted @ 2020-12-10 23:48  mohist  阅读(767)  评论(0编辑  收藏  举报