我有義務在C++ Builder(RAD Studio XE5)中使用VirtualStringTree組件。 我需要提供一種可能性來對我的樹的元素進行負面檢查。VirtualTreeView n狀態複選框
例如,讓我們看看沒有孩子的節點。 我希望能夠用「V」符號(像往常一樣)和「X」符號來檢查此節點。當然,這個節點必須能夠被取消選中。 可以通過在節點點擊第二次或點擊右鍵來設置「X」。
如何實現?
不幸的是,內置的三態複選框僅爲節點提供了額外的狀態,這些節點已同時檢查和取消選中子節點。
我有義務在C++ Builder(RAD Studio XE5)中使用VirtualStringTree組件。 我需要提供一種可能性來對我的樹的元素進行負面檢查。VirtualTreeView n狀態複選框
例如,讓我們看看沒有孩子的節點。 我希望能夠用「V」符號(像往常一樣)和「X」符號來檢查此節點。當然,這個節點必須能夠被取消選中。 可以通過在節點點擊第二次或點擊右鍵來設置「X」。
如何實現?
不幸的是,內置的三態複選框僅爲節點提供了額外的狀態,這些節點已同時檢查和取消選中子節點。
我找到了這樣的方法。
在該節點的記錄結構必須添加表示其檢查狀態的附加字段(它可以具有例如類型炭)。
然後選擇節點的CheckType = ctButton。在這種情況下,點擊這個小按鈕就會觸發OnChecked事件。每次點擊都必須增加節點在環中的檢查狀態(0-> 1-> 2-> 3-> 0-> 1 ...)。
if(checkState < 3)
++checkState;
else
checkState = 0;
最後一步是用您的圖像重新繪製按鈕。我使用了三個圖像:空方塊,「V」和「X」。圖像可以放置在ImageList中,尺寸應爲15x15。然後,像這樣定義OnAfterCellPaint事件:
void __fastcall TSomeForm::TreeAfterCellPaint(TBaseVirtualTree *Sender,
TCanvas *TargetCanvas, PVirtualNode Node, TColumnIndex Column,
TRect &CellRect)
{
Record* record = (Record*)Tree->GetNodeData(Node);
int offset = 22 + 18 * Tree->GetNodeLevel(Node);
CheckBoxesImageList->Draw(TargetCanvas, CellRect.Left + offset, CellRect.Top + 1, record->CheckState);
}
偏移實驗發現:)