SetNodeChecked和IsNodeChecked是在网络上copy的,出处很多,我也不知道谁是原创的,故不指明出处,仅指明转载
CheckTreeView是本人原创,因为没找到一个类似的函数,个人觉得这个函数用了Hack技巧,不是正规方法,如果您知道其他方法,望不吝赐教
my email:
mail549@gmail.com
procedure CheckTreeView(TreeView: TCustomTreeView; Check: Boolean = True);
procedure Hack(TreeView: TCustomTreeView);
var
TempStream: TMemoryStream;
begin
TempStream := TMemoryStream.Create;
try
TreeView.SaveToStream(TempStream);
TempStream.Position := 0;
TreeView.LoadFromStream(TempStream);
finally
TempStream.Free;
end;
end;
begin
if Check then
SetWindowLong(TreeView.Handle, GWL_STYLE,
GetWindowLong(TreeView.Handle, GWL_STYLE) or TVS_CHECKBOXES)
else begin
SetWindowLong(TreeView.Handle, GWL_STYLE,
GetWindowLong(TreeView.Handle, GWL_STYLE) and not TVS_CHECKBOXES);
Hack(TreeView);
end;
end;
procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem;
begin
CheckTreeView(Node.TreeView);
FillChar(TvItem, SizeOf(TvItem), 0);
with TvItem do begin
hItem := Node.ItemId;
Mask := TVIF_STATE;
StateMask := TVIS_STATEIMAGEMASK;
if Checked then
TvItem.State :=TVIS_CHECKED
else
TvItem.State :=TVIS_CHECKED shr 1;
TreeView_SetItem(Node.TreeView.Handle, TvItem);
end;
end;
function IsNodeChecked(Node: TTreeNode): Boolean;
const
TVIS_CHECKED = $2000;
var
TvItem :TTVItem; //declared in CommCtrl
begin
TvItem.Mask := TVIF_STATE;
TvItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TvItem);
Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;
function IsTreeViewChecked(TreeView: TCustomTreeView): Boolean;
begin
Result :=
GetWindowLong(TreeView.Handle, GWL_STYLE) and TVS_CHECKBOXES = TVS_CHECKBOXES;
end;