2015-12-08 349 views
1

我有義務在C++ Builder(RAD Studio XE5)中使用VirtualStringTree組件。 我需要提供一種可能性來對我的樹的元素進行負面檢查。VirtualTreeView n狀態複選框

例如,讓我們看看沒有孩子的節點。 我希望能夠用「V」符號(像往常一樣)和「X」符號來檢查此節點。當然,這個節點必須能夠被取消選中。 可以通過在節點點擊第二次或點擊右鍵來設置「X」。

如何實現?

不幸的是,內置的三態複選框僅爲節點提供了額外的狀態,這些節點已同時檢查和取消選中子節點。

回答

1

我找到了這樣的方法。

  1. 在該節點的記錄結構必須添加表示其檢查狀態的附加字段(它可以具有例如類型)。

  2. 然後選擇節點的CheckType = ctButton。在這種情況下,點擊這個小按鈕就會觸發OnChecked事件。每次點擊都必須增加節點在環中的檢查狀態(0-> 1-> 2-> 3-> 0-> 1 ...)。

    if(checkState < 3) 
        ++checkState; 
    else 
        checkState = 0; 
    
  3. 最後一步是用您的圖像重新繪製按鈕。我使用了三個圖像:空方塊,「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); 
    } 
    

    偏移實驗發現:)