VirtualTreeView n-state 个复选框
VirtualTreeView n-state checkboxes
我不得不在 C++ Builder (RAD Studio XE5) 中使用 VirtualStringTree 组件。
我需要为树的 negative-check 个元素提供可能性。
例如,我们看一下没有child的节点。
我希望能够用 "V" 符号(像往常一样)和 "X" 符号检查这个节点。当然,这个节点必须能够取消选中。
"X"可以在节点处第二次点击或右键点击设置。
如何实现?
Built-in tri-state 复选框,不幸的是,只为节点提供了一个额外的状态,这些节点同时选中和取消选中 children。
我找到了这样的方法。
在节点的记录结构中必须添加显示其检查状态的附加字段(例如,它可以具有 char 类型)。
然后选择节点的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);
}
偏移量是通过实验找到的:)
我不得不在 C++ Builder (RAD Studio XE5) 中使用 VirtualStringTree 组件。 我需要为树的 negative-check 个元素提供可能性。
例如,我们看一下没有child的节点。 我希望能够用 "V" 符号(像往常一样)和 "X" 符号检查这个节点。当然,这个节点必须能够取消选中。 "X"可以在节点处第二次点击或右键点击设置。
如何实现?
Built-in tri-state 复选框,不幸的是,只为节点提供了一个额外的状态,这些节点同时选中和取消选中 children。
我找到了这样的方法。
在节点的记录结构中必须添加显示其检查状态的附加字段(例如,它可以具有 char 类型)。
然后选择节点的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); }
偏移量是通过实验找到的:)