TTreeView是VCL中提供的樹列表控件,樹的每個節點是一個TTreeNode類,TTreeNode組件的屬性和方法可以參考Borland提供的幫助(雖然不如MSDN全面,但有總比沒有強)。實際應用中我們可能需要禁用某個節點(界面上反應的效果是:節點字體呈灰色顯示,節點無法選中等)。但是VCL沒有提供Node->Disable();或Node->Enable = false;這樣的功能,我們只好自己動手實現了。首先我們需要為每個節點設定一個標志,用來標識此節點是否可用,標識方法有很多,比如判斷節點的文本(Text),節點的絕對索引值(AbsoluteIndex),節點的索引(Index)加縮進(Indent)等,在本例中我們用節點的Data屬性作標識(一個void
*型數據,其實可以存放N多東西)。如果在你的應用中恰好用了Data屬性,就另外想個用來作標志的方法吧。:)
我們寫一個自定義函數,用來啟用/禁用一個節點:
void __fastcall CrnEnableTreeNode(
bool bEnable, TTreeNode *pNode)
{
pNode->Data = bEnable? NULL: (
void *)0xFFFF;
// 本文轉自 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)
{
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();