VirtualTreeView n状态复选框

时间:2015-12-08 15:45:25

标签: checkbox c++builder virtualtreeview

我不得不在C ++ Builder(RAD Studio XE5)中使用VirtualStringTree组件。 而且我需要提供负面检查我的树元素的可能性。

例如,让我们看看没有子节点的节点。 我希望能够用“V”符号(像往常一样)和“X”符号来检查这个节点。当然,此节点必须能够取消选中。 可以通过节点上的第二次单击或右键单击来设置“X”。

如何实施?

遗憾的是,内置的三态复选框只为节点提供了一个额外的状态,它同时检查和取消选中子节点。

1 个答案:

答案 0 :(得分:1)

我找到了这样的方式。

  1. 在节点的记录结构中必须添加显示其检查状态的附加字段(例如,它可以具有 char 类型)。

  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);
    }
    

    通过实验发现偏移量:)