【问题标题】:VirtualTreeView n-state checkboxesVirtualTreeView n-state 复选框
【发布时间】:2016-03-13 14:54:17
【问题描述】:

我必须在 C++ Builder (RAD Studio XE5) 中使用 VirtualStringTree 组件。 而且我需要提供对我的树的元素进行否定检查的可能性。

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

如何实现?

不幸的是,内置的三态复选框仅为节点提供了额外的状态,这些节点同时具有选中和未选中的子节点。

【问题讨论】:

    标签: checkbox c++builder virtualtreeview


    【解决方案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);
      }
      

      偏移量是通过实验找到的:)

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2016-04-03
      • 1970-01-01
      • 2017-12-31
      • 2015-01-03
      • 2021-06-09
      相关资源
      最近更新 更多