如何禁用一个树节点(Disable Tree Node)
2008-02-23 05:34:22来源:互联网 阅读 ()
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
// 本文转自 C Builder 研究 - http://www.ccrun.com/article.asp?i=1015&d=r2tf61
pNode->TreeView->Invalidate();
}
然后考虑如何达到禁用节点的效果,前面说了,我们只需实现这两个效果:
1. 节点字体呈灰色显示
2. 节点无法选中
节点字体呈灰色显示能够通过TreeView的OnCustomDrawItem事件中的自绘实现,在设计时状态,选中TreeView,Events选项卡双击OnCustomDrawItem事件,添加以下代码:
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1CustomDrawItem(TCustomTreeView *Sender,
TTreeNode *Node, TCustomDrawState State, 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 __fastcall TForm1::TreeView1Changing(TObject *Sender, TTreeNode *Node,
bool &AllowChange)
{
// 欲选中这个节点时,判断假如当前节点被禁用则禁止改变原节点的选择状态
AllowChange = (int(Node->Data) != 0xFFFF);
}
有以上的实现,效果基本就出来了:
测试代码:
//---------------------------------------------------------------------------
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();
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇: C 习题和解析(继承和派生-01)
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash