当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:56:00  来源:本站整理

若何禁用一个树节点(Disable Tree Node)[VC/C++编程]

赞助商链接



  本文“若何禁用一个树节点(Disable Tree Node)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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)
{
   //欲选中这个节点时,判断假如当前节点被禁用则禁止改变原节点的挑选状况 本文发表于http://bianceng.cn(编程入门网)
   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();


  以上是“若何禁用一个树节点(Disable Tree Node)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 教大家若何禁用笔记本内置麦克风-关闭笔记本内置麦克风办法
  • 若何禁用一个树节点(Disable Tree Node)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .