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);
}
有以上的实现,结果根基就出来了:
测试代码:
//---------------------------------------------------------------------------
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();