我需要创建一个带有复选框节点的树视图,如下图:
怎么做?
谢谢!
该TTreeView
组件本身不支持复选框,但标准 WindowsTREEVIEW
控件通过以下TVS_CHECKBOXES
样式支持:
TVS_CHECKBOXES
4.70 版。为树视图控件中的项目启用复选框。仅当图像与项目相关联时才会显示复选框。当设置为此样式时,控件有效地使用DrawFrameControl创建和设置包含两个图像的状态图像列表。状态图像 1 是未选中的框,状态图像 2 是选中的框。将状态图像设置为零会完全删除该复选框。有关更多信息,请参阅使用状态图像索引。
版本 5.80。即使没有图像与该项目关联,也显示一个复选框。
使用此样式创建树视图控件后,无法删除该样式。相反,您必须销毁控件并在其位置创建一个新控件。销毁树视图控件不会破坏复选框状态图像列表。你必须明确地销毁它。通过向树视图控件发送TVM_GETIMAGELIST消息来获取状态图像列表的句柄。然后使用ImageList_Destroy销毁图像列表。
如果要使用此样式,则必须在创建树视图控件之后和填充树之前使用SetWindowLong设置 TVS_CHECKBOXES 样式。否则,复选框可能会显示为未选中,具体取决于时间问题。
要将TVS_CHECKBOXES
样式应用于TTreeView
组件,您应该派生一个新组件并覆盖虚拟CreateParams()
方法,例如:
class TMyTreeView : public TTreeView
{
protected:
virtual void __fastcall CreateParams(TCreateParams &Params);
};
void __fastcall TMyTreeView::CreateParams(TCreateParams &Params)
{
TTreeView::CreateParams(Params);
Params.Style |= TVS_CHECKBOXES;
}
要在代码中分配复选框状态,您可以使用TreeView_GetItem()
/TreeView_SetItem()
宏根据需要切换节点的状态图像索引。
或者,一种更灵活的方法是简单地将您自己TImageList
的属性分配给TTreeView::StateImages
属性并用您想要的任何复选框图像填充它,然后您可以TTreeNode::StateIndex
根据需要设置属性。要对复选框上的用户输入做出反应,请使用TTreeView::OnClick
和TTreeView::OnKeyDown
事件TTreeNode::StateIndex
相应地切换:
void __fastcall ToggleTreeNodeCheckBox(TTreeNode *Node)
{
if ((Node) && (Node->StateIndex != -1))
{
if (Node->StateIndex == MyCheckedStateImageIndex)
Node->StateIndex = MyUncheckedStateImageIndex;
else
Node->StateIndex = MyCheckedStateImageIndex;
}
}
void __fastcall TMyForm::TreeView1Click(TObject *Sender)
{
TPoint P;
::GetCursorPos(&P);
// or: P = Mouse->CursorPos;
// or: POINTS pts = MAKEPOINTS(::GetMessagePos()); P = Point(pts.x, pts.y);
P = TreeView1->ScreenToClient(P);
if (TreeView1->GetHitTestInfoAt(P.x, P.y).Contains(htOnStateIcon))
ToggleTreeNodeCheckBox(TreeView1->GetNodeAt(P.x, P.y));
}
void __fastcall TMyForm1::TreeView1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
if (Key == VK_SPACE)
ToggleTreeNodeCheckBox(TreeView1->Selected);
}