当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++ Builder教程

函数实现禁用一个树节点(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 __fastcall CrnEnableTreeNode(bool bEnable, TTreeNode *pNode)
{
    // 设定规则,如果节点允许使用,Node的Data存放0(默认就是0),
    // 如果禁用,Data存放0xFFFF
    pNode->Data = bEnable? NULL: (void *)0xFFFF;
    // 标志改变后重绘一下TreeView


测试代码:
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // 禁用当前选中的节点
    if(TreeView1->Selected)
        CrnEnableTreeNode(true, TreeView1->Selected);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    // 启用第二个节点
    CrnEnableTreeNode(true, TreeView1->Items->Item[1]);
}
//---------------------------------------------------------------------------
为看到比较好的效果,可在测试时展开所有节点为:
TreeView1->FullExpand();

相关内容
赞助商链接