procedure TCustomTreeView.CreateParams(var Params: TCreateParams); const BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER); LineStyles: array[Boolean] of DWORD = (0, TVS_HASLINES); RootStyles: array[Boolean] of DWORD = (0, TVS_LINESATROOT); ButtonStyles: array[Boolean] of DWORD = (0, TVS_HASBUTTONS); EditStyles: array[Boolean] of DWORD = (TVS_EDITLABELS, 0); HideSelections: array[Boolean] of DWORD = (TVS_SHOWSELALWAYS, 0); DragStyles: array[TDragMode] of DWORD = (TVS_DISABLEDRAGDROP, 0); RTLStyles: array[Boolean] of DWORD = (0, TVS_RTLREADING); ToolTipStyles: array[Boolean] of DWORD = (TVS_NOTOOLTIPS, 0); AutoExpandStyles: array[Boolean] of DWORD = (0, TVS_SINGLEEXPAND); HotTrackStyles: array[Boolean] of DWORD = (0, TVS_TRACKSELECT); RowSelectStyles: array[Boolean] of DWORD = (0, TVS_FULLROWSELECT); begin InitCommonControl(ICC_TREEVIEW_CLASSES); inherited CreateParams(Params); CreateSubClass(Params, WC_TREEVIEW); with Params do begin Style := Style or LineStyles[FShowLines] or BorderStyles[FBorderStyle] or RootStyles[FShowRoot] or ButtonStyles[FShowButtons] or EditStyles[FReadOnly] or HideSelections[FHideSelection] or DragStyles[DragMode] or RTLStyles[UseRightToLeftReading] or ToolTipStyles[FToolTips] or AutoExpandStyles[FAutoExpand] or HotTrackStyles[FHotTrack] or RowSelectStyles[FRowSelect]; if Ctl3D and NewStyleControls and (FBorderStyle = bsSingle) then begin Style := Style and not WS_BORDER; ExStyle := Params.ExStyle or WS_EX_CLIENTEDGE; end; WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW); end; end;procedure TCustomTreeView.CreateWnd; var I: Integer; begin FStateChanging := False; inherited CreateWnd; TreeView_SetBkColor(Handle, ColorToRGB(Color)); TreeView_SetTextColor(Handle, ColorToRGB(Font.Color)); if FMemStream <> nil then begin Items.BeginUpdate; try Items.ReadData(FMemStream); Items.ReadExpandedState(FMemStream); FreeAndNil(FMemStream); SetTopItem(Items.GetNodeFromIndex(FSaveTopIndex)); FSaveTopIndex := 0; if FSaveIndexes <> nil then begin for I := 0 to FSaveIndexes.Count - 1 do FSelections.Add(Items.GetNodeFromIndex(Integer(FSaveIndexes[I]))); FreeAndNil(FSaveIndexes); ValidateSelection; SetSelected(Selections[0]); end else SetSelected(Items.GetNodeFromIndex(FSaveIndex)); FSaveIndex := 0; finally Items.EndUpdate; end; end; if FSaveIndent <> -1 then Indent := FSaveIndent; if (Images <> nil) and Images.HandleAllocated then SetImageList(Images.Handle, TVSIL_NORMAL); if (StateImages <> nil) and StateImages.HandleAllocated then SetImageList(StateImages.Handle, TVSIL_STATE); end;procedure TCustomTreeView.DestroyWnd; var Node: TTreeNode; I: Integer; begin FStateChanging := True; FRClickNode := nil; if FCreateWndRestores and (Items.Count > 0) then begin FMemStream := TMemoryStream.Create; Items.WriteData(FMemStream); Items.WriteExpandedState(FMemStream); FMemStream.Position := 0; FSaveTopIndex := 0; FSaveIndex := 0; Node := GetTopItem; if Node <> nil then FSaveTopIndex := Node.AbsoluteIndex; Items.BeginUpdate; try if MultiSelect and (FSelections.Count > 1) then begin FSaveIndexes := TList.Create; for I := 0 to FSelections.Count - 1 do FSaveIndexes.Add(Pointer(TTreeNode(FSelections[I]).AbsoluteIndex)); FSelections.Clear; end else begin Node := Selected; if Node <> nil then FSaveIndex := Node.AbsoluteIndex; end; Items.Clear; finally Items.EndUpdate; end; end; FSaveIndent := Indent; inherited DestroyWnd; end;function TCustomTreeView.GetHitTestInfoAt(X, Y: Integer): THitTests; var HitTest: TTVHitTestInfo; begin Result := []; with HitTest do begin pt.X := X; pt.Y := Y; TreeView_HitTest(Handle, HitTest); if (flags and TVHT_ABOVE) <> 0 then Include(Result, htAbove); if (flags and TVHT_BELOW) <> 0 then Include(Result, htBelow); if (flags and TVHT_NOWHERE) <> 0 then Include(Result, htNowhere); if (flags and TVHT_ONITEM) = TVHT_ONITEM then Include(Result, htOnItem) else begin if (flags and TVHT_ONITEM) <> 0 then Include(Result, htOnItem); if (flags and TVHT_ONITEMICON) <> 0 then Include(Result, htOnIcon); if (flags and TVHT_ONITEMLABEL) <> 0 then Include(Result, htOnLabel); if (flags and TVHT_ONITEMSTATEICON) <> 0 then Include(Result, htOnStateIcon); end; if (flags and TVHT_ONITEMBUTTON) <> 0 then Include(Result, htOnButton); if (flags and TVHT_ONITEMINDENT) <> 0 then Include(Result, htOnIndent); if (flags and TVHT_ONITEMRIGHT) <> 0 then Include(Result, htOnRight); if (flags and TVHT_TOLEFT) <> 0 then Include(Result, htToLeft); if (flags and TVHT_TORIGHT) <> 0 then Include(Result, htToRight); end; end;
procedure TCustomTreeView.CreateParams(var Params: TCreateParams);
const
BorderStyles: array[TBorderStyle] of DWORD = (0, WS_BORDER);
LineStyles: array[Boolean] of DWORD = (0, TVS_HASLINES);
RootStyles: array[Boolean] of DWORD = (0, TVS_LINESATROOT);
ButtonStyles: array[Boolean] of DWORD = (0, TVS_HASBUTTONS);
EditStyles: array[Boolean] of DWORD = (TVS_EDITLABELS, 0);
HideSelections: array[Boolean] of DWORD = (TVS_SHOWSELALWAYS, 0);
DragStyles: array[TDragMode] of DWORD = (TVS_DISABLEDRAGDROP, 0);
RTLStyles: array[Boolean] of DWORD = (0, TVS_RTLREADING);
ToolTipStyles: array[Boolean] of DWORD = (TVS_NOTOOLTIPS, 0);
AutoExpandStyles: array[Boolean] of DWORD = (0, TVS_SINGLEEXPAND);
HotTrackStyles: array[Boolean] of DWORD = (0, TVS_TRACKSELECT);
RowSelectStyles: array[Boolean] of DWORD = (0, TVS_FULLROWSELECT);
begin
InitCommonControl(ICC_TREEVIEW_CLASSES);
inherited CreateParams(Params);
CreateSubClass(Params, WC_TREEVIEW);
with Params do
begin
Style := Style or LineStyles[FShowLines] or BorderStyles[FBorderStyle] or
RootStyles[FShowRoot] or ButtonStyles[FShowButtons] or
EditStyles[FReadOnly] or HideSelections[FHideSelection] or
DragStyles[DragMode] or RTLStyles[UseRightToLeftReading] or
ToolTipStyles[FToolTips] or AutoExpandStyles[FAutoExpand] or
HotTrackStyles[FHotTrack] or RowSelectStyles[FRowSelect];
if Ctl3D and NewStyleControls and (FBorderStyle = bsSingle) then
begin
Style := Style and not WS_BORDER;
ExStyle := Params.ExStyle or WS_EX_CLIENTEDGE;
end;
WindowClass.style := WindowClass.style and not (CS_HREDRAW or CS_VREDRAW);
end;
end;procedure TCustomTreeView.CreateWnd;
var
I: Integer;
begin
FStateChanging := False;
inherited CreateWnd;
TreeView_SetBkColor(Handle, ColorToRGB(Color));
TreeView_SetTextColor(Handle, ColorToRGB(Font.Color));
if FMemStream <> nil then
begin
Items.BeginUpdate;
try
Items.ReadData(FMemStream);
Items.ReadExpandedState(FMemStream);
FreeAndNil(FMemStream);
SetTopItem(Items.GetNodeFromIndex(FSaveTopIndex));
FSaveTopIndex := 0;
if FSaveIndexes <> nil then
begin
for I := 0 to FSaveIndexes.Count - 1 do
FSelections.Add(Items.GetNodeFromIndex(Integer(FSaveIndexes[I])));
FreeAndNil(FSaveIndexes);
ValidateSelection;
SetSelected(Selections[0]);
end
else
SetSelected(Items.GetNodeFromIndex(FSaveIndex));
FSaveIndex := 0;
finally
Items.EndUpdate;
end;
end;
if FSaveIndent <> -1 then
Indent := FSaveIndent;
if (Images <> nil) and Images.HandleAllocated then
SetImageList(Images.Handle, TVSIL_NORMAL);
if (StateImages <> nil) and StateImages.HandleAllocated then
SetImageList(StateImages.Handle, TVSIL_STATE);
end;procedure TCustomTreeView.DestroyWnd;
var
Node: TTreeNode;
I: Integer;
begin
FStateChanging := True;
FRClickNode := nil;
if FCreateWndRestores and (Items.Count > 0) then
begin
FMemStream := TMemoryStream.Create;
Items.WriteData(FMemStream);
Items.WriteExpandedState(FMemStream);
FMemStream.Position := 0;
FSaveTopIndex := 0;
FSaveIndex := 0;
Node := GetTopItem;
if Node <> nil then
FSaveTopIndex := Node.AbsoluteIndex;
Items.BeginUpdate;
try
if MultiSelect and (FSelections.Count > 1) then
begin
FSaveIndexes := TList.Create;
for I := 0 to FSelections.Count - 1 do
FSaveIndexes.Add(Pointer(TTreeNode(FSelections[I]).AbsoluteIndex));
FSelections.Clear;
end
else
begin
Node := Selected;
if Node <> nil then
FSaveIndex := Node.AbsoluteIndex;
end;
Items.Clear;
finally
Items.EndUpdate;
end;
end;
FSaveIndent := Indent;
inherited DestroyWnd;
end;function TCustomTreeView.GetHitTestInfoAt(X, Y: Integer): THitTests;
var
HitTest: TTVHitTestInfo;
begin
Result := [];
with HitTest do
begin
pt.X := X;
pt.Y := Y;
TreeView_HitTest(Handle, HitTest);
if (flags and TVHT_ABOVE) <> 0 then Include(Result, htAbove);
if (flags and TVHT_BELOW) <> 0 then Include(Result, htBelow);
if (flags and TVHT_NOWHERE) <> 0 then Include(Result, htNowhere);
if (flags and TVHT_ONITEM) = TVHT_ONITEM then
Include(Result, htOnItem)
else
begin
if (flags and TVHT_ONITEM) <> 0 then Include(Result, htOnItem);
if (flags and TVHT_ONITEMICON) <> 0 then Include(Result, htOnIcon);
if (flags and TVHT_ONITEMLABEL) <> 0 then Include(Result, htOnLabel);
if (flags and TVHT_ONITEMSTATEICON) <> 0 then Include(Result, htOnStateIcon);
end;
if (flags and TVHT_ONITEMBUTTON) <> 0 then Include(Result, htOnButton);
if (flags and TVHT_ONITEMINDENT) <> 0 then Include(Result, htOnIndent);
if (flags and TVHT_ONITEMRIGHT) <> 0 then Include(Result, htOnRight);
if (flags and TVHT_TOLEFT) <> 0 then Include(Result, htToLeft);
if (flags and TVHT_TORIGHT) <> 0 then Include(Result, htToRight);
end;
end;
TreeView1.Items.Item[0].HasChildren := true;
要想拿加号:
TreeView1.Items.Item[0].HasChildren := true;-----
这个做没有试过
不过以前在VB下就是加入一个子结点,再把它删除,加号就出来了