如何禁用一个树节点(Disable Tree Node)
当前位置:以往代写 > C/C++ 教程 >如何禁用一个树节点(Disable Tree Node)
2019-06-13

如何禁用一个树节点(Disable Tree Node)

如何禁用一个树节点(Disable Tree Node)

TTreeView是VCL中提供的树列表控件,树的每个节点是一个TTreeNode类,TTreeNode组件的属性和要领可以参考Borland提供的辅佐(固然不如MSDN全面,但有总比没有强)。实际应用中我们大概需要禁用某个节点(界面上回响的结果是:节点字体呈灰色显示,节点无法选中等)。可是VCL没有提供Node->Disable();或Node->Enable=false;这样的成果,我们只好本身动手实现了。首先我们需要为每个节点设定一个符号,用来标识此节点是否可用,标识要领有许多,好比判定节点的文本(Text),节点的绝对索引值(AbsoluteIndex),节点的索引(Index)加缩进(Indent)等,在本例中我们用节点的Data属性作标识(一个void *型数据,其实可以存放N多对象)。假如在你的应用中刚好用了Data属性,就别的想个用来作符号的要领吧。:)

我们写一个自界说函数,用来启用/禁用一个节点:

//---------------------------------------------------------------------------
//函数成果:改变指定节点的启用/禁用状态
//  bEnable:启用:true;禁用:false
//  pNode:要改变状态的节点
void__fastcallCrnEnableTreeNode(boolbEnable,TTreeNode*pNode)
{
   //设定法则,假如节点答允利用,Node的Data存放0(默认就是0),
   //假如禁用,Data存放0xFFFF
   pNode->Data=bEnable?NULL:(void*)0xFFFF;
   //符号改变后重绘一下TreeView
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=1015&d=r2tf61
   pNode->TreeView->Invalidate();
}

然后思量如何到达禁用节点的结果,前面说了,我们只需实现这两个结果:

1.节点字体呈灰色显示

2.节点无法选中

节点字体呈灰色显示可以通过TreeView的OnCustomDrawItem事件中的自绘实现,在设计时状态,选中TreeView,Events选项卡双击OnCustomDrawItem事件,添加以下代码:

//---------------------------------------------------------------------------
void__fastcallTForm1::TreeView1CustomDrawItem(TCustomTreeView*Sender,
    TTreeNode*Node,TCustomDrawStateState,bool&DefaultDraw)
{
   //判定当前绘制节点是否被禁用
   // 63 63 72 75 6E 2E 63 6F 6D
   if(int(Node->Data)==0xFFFF)
   {
     //假如节点被禁用则用灰色字体显示,默认为玄色
     Sender->Canvas->Font->Color=clGray;
   }
}

节点无法选中则可以通过TreeView的Changing事件来处理惩罚,在设计时状态,选中TreeView,Events选项卡双击OnChanging事件,添加以下代码:

//---------------------------------------------------------------------------
void__fastcallTForm1::TreeView1Changing(TObject*Sender,TTreeNode*Node,
    bool&AllowChange)
{
   //欲选中这个节点时,判定假如当前节点被禁用则克制改变原节点的选择状态
   AllowChange=(int(Node->Data)!=0xFFFF);
}

有以上的实现,结果根基就出来了:

如何禁用一个树节点(Disable Tree Node)

测试代码:

//---------------------------------------------------------------------------
void__fastcallTForm1::Button1Click(TObject*Sender)
{
   //禁用当前选中的节点
   if(TreeView1->Selected)
     CrnEnableTreeNode(true,TreeView1->Selected);
}
//---------------------------------------------------------------------------
void__fastcallTForm1::Button2Click(TObject*Sender)
{
   //启用第二个节点
   CrnEnableTreeNode(true,TreeView1->Items->Item[1]);
}
//---------------------------------------------------------------------------

为看到较量好的结果,可在测试时展开所有节点为:

TreeView1->FullExpand();

    关键字:

在线提交作业