基于C++Builder的TreeView控件的使用小结

1.给默认的树形列表控件前面增加选择框,下面的方法也是基于该带复选框的树形控件

   SetWindowLong(TreeView1->Handle,GWL_STYLE,GetWindowLong(TreeView1->Handle,GWL_STYLE) | TVS_CHECKBOXES); 
   

2.在1的情况下,很难拿到常规的鼠标点击的树形列表的节点,下面在鼠标事件中实现该功能

//直接在头文件定义该函数,默认绑定到控件,不需要再将函数与控件方法相绑定
//响应鼠标的点击事件,确认勾选节点
void __fastcall  TForm1::TreeView1MouseDown(TObject *Sender,
	  TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //直接用控件的select方法拿不到正确的节点
  TTreeNode *CurrentNote = TreeView1->GetNodeAt(X, Y);//拿到鼠标点击的节点
  if(!CurrentNote)//点击空白处时做出正常反应
  {
	 return;
  }
   CurrentNote->Expanded = true;//展开节点
}

3.根据树形目录节点,拿到绝对路径

/*****************************************************************************
*  Function:       根据树形目录的节点值,拿到绝对路径
*  parameter:     树形目录节点
*  Author :       Zero
******************************************************************************/
UnicodeString TForm1::GetNodeFullName(TTreeNode *myNode)
{
   UnicodeString  tmpStr;
   TTreeNode *tmpNode = myNode;
   tmpStr = tmpNode->Text;
   while(tmpNode->Parent)
   {
	  tmpNode = tmpNode->Parent;
	  tmpStr = tmpNode->Text+"\\"+ tmpStr;
   }
   return tmpStr;
}

4.判断节点状态是否被选中

/*****************************************************************************
*  Function:       判断带CheckBox的树形节点是否被选中
*  parameter:     树形目录节点
*  Author :       Zero
******************************************************************************/
bool GetNodeChecked(TTreeNode *ANode)
{
	TVITEM tvItem;
	tvItem.mask = TVIF_HANDLE | TVIF_STATE;
	tvItem.hItem = ANode->ItemId;
	tvItem.stateMask = TVIS_STATEIMAGEMASK;
	TreeView_GetItem(ANode->TreeView->Handle, &tvItem);
	return ((BOOL)(tvItem.state >> 12) -1);
}

5.设置节点的选中状态

/*****************************************************************************
*  Function:       设置树形节点是否被选中
*  parameter:     树形目录节点
*  Author :       Zero
******************************************************************************/
void SetNodeChecked(TTreeNode *ANode,bool IsSetToChecked)
{
	TVITEM tvItem;
	tvItem.mask = TVIF_HANDLE | TVIF_STATE;
	tvItem.hItem = ANode->ItemId;
	tvItem.stateMask = TVIS_STATEIMAGEMASK;
	tvItem.state = INDEXTOSTATEIMAGEMASK(IsSetToChecked?2:1);
	TreeView_SetItem(ANode->TreeView->Handle, &tvItem);
}

6.设置节点的子节点的选中状态

/*****************************************************************************
*  Function:       将树形目录节点的子节点设置成跟该节点一样的选中状态yn
*  parameter:     树形目录节点
*  Author :       Zero
******************************************************************************/
void SetChildChecked(TTreeNode *ANode,bool yn)
{
	int count=ANode->Count;
	SetNodeChecked(ANode,yn);
	if (count!=0)
	for (int i=0;i<count;i++) // 递归
	{
	  SetChildChecked(ANode->Item[i],yn);
	}
}

7.拿到目标节点的所有子节点

/*****************************************************************************
*  Function:       获取目标树形节点的所有子节点 
*  parameter:     树形目录节点
*  Author :       Zero
******************************************************************************/
void TForm1::GetAllChild(TTreeNode *ANode)
{
   TTreeNode *tmpNode;
   UnicodeString myStr;
   tmpNode = ANode->getFirstChild();
   while(tmpNode)
   {
  
	 GetAllChild(tmpNode);
	 tmpNode = ANode->GetNextChild(tmpNode);
   }
}
​
//设置选中的图片文件的图标
//这个问题时因为,选中的时候,一直图标显示不正确,至少第一次的图标会不正确
void __fastcall TForm1::TreeView1Change(TObject *Sender,TTreeNode *Node)
{
	UnicodeString nodeValue =  TreeView1->Selected->Text;
	if(nodeValue.Pos(".") != 0)
	{
	   TreeView1->Selected->SelectedIndex = 1;
	   TreeView1->Selected->ImageIndex = 1;
	}
}

​

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页