2015-12-08 181 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); 
    } 
    

    偏移实验发现:)