下面的代码可以让Treeview前面显示CheckBox
const
TVS_CHECKBOXES = $00000100;
procedure SetComCtrlStyle(WinCtrl: TWinControl; Value: Integer; UseStyle: Boolean);
var
Style: Integer;
begin
if WinCtrl.HandleAllocated then
begin
Style := GetWindowLong(WinCtrl.Handle, GWL_STYLE);
if not UseStyle then
Style := Style and not Value
else Style := Style or Value;
SetWindowLong(WinCtrl.Handle, GWL_STYLE, Style);
end;
end;
然后 在 OnCreate 调用:
SetComCtrlStyle(TreeView1, TVS_CHECKBOXES, True);
或者干脆简单点,一句话完事:
SetWindowLong(TreeView1.Handle, GWL_STYLE, GetWindowLong(TreeView1.Handle, GWL_STYLE) or $00000100);
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, CommCtrl, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
function IsNodeChecked(Node :TTreeNode) :Boolean;
public
{ Public declarations }
end;
const
TVIS_CHECKED = $2000;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if (TreeView1.Selected = nil) then Exit;
ShowMessage('Node checked? ' + BoolToStr(IsNodeChecked(TreeView1.Selected), True));
end;
procedure TForm1.FormCreate(Sender: TObject);
var
dw: DWORD;
begin
//给TreeView加上CheckBoxes
dw := GetWindowLong( TreeView1.Handle, GWL_STYLE);
dw := dw or TVS_CHECKBOXES;
SetWindowLong(TreeView1.Handle, GWL_STYLE , dw);
end;
procedure TForm1.Button2Click(Sender: TObject);
//设置node的check状态
procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
var
TvItem :TTVItem;
begin
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;
begin
if (TreeView1.Selected = nil) then Exit;
SetNodeChecked(TreeView1.Selected, not IsNodeChecked(TreeView1.Selected));
end;
//检查Node是否Checked
function TForm1.IsNodeChecked(Node: TTreeNode): Boolean;
var
TvItem :TTVItem;
begin
TvItem.Mask := TVIF_STATE;
TvItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TvItem);
Result := (TvItem.State and TVIS_CHECKED) = TVIS_CHECKED;
end;
end.
博客给出让Treeview前面显示CheckBox的代码。定义了SetComCtrlStyle函数用于设置控件样式,在OnCreate中调用该函数或直接用SetWindowLong函数实现。还包含判断节点是否选中、设置节点选中状态等功能的代码,涉及Windows、Classes等单元。

被折叠的 条评论
为什么被折叠?



