treeview+images模拟treeview结点内嵌checkbox控件时遇到的问题 本人自己动手画了两个类似checkbox的ico(一个代表选中,一个代表未选中),用于模拟treeview结点+checkbox的状态,但是始终搞不出满意的效果。当选好状态后,父结点一colllasping状态就变相反的状态了...请高手相救,调出一个令人比较满意的treeview + images控件模拟treeview的各结点内嵌checkbox的效果 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //TreeView不需要图片即可实现CheckBoxes//代码如下,至于其它点击事件的处理,应该比较简单unit Unit1;interfaceuses 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是否Checkedfunction 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. 或者用免费的控件:CNPackhttp://www.cnvcl.org/index.php?lang=zh-cn 你可以看一下,Raize控件中的RzCheckListr控件,功能很不错的,当你选择父时,自动选择全部子,当取消时也全部取消!见意你试一下,比你用Image中图片好多了 delphi fastreport 整形变量的问题 关于DBGrid排序的问题? 高手请进,关于一个字符串的处理? 高手看看 如何让做一个按钮让combobox内ITEMS内的值显示下个记录 80元提供“个人稳当管理器”小程序Delphi源代码 delphi做web开发好吗 怎样在DbGrid中创建控件。 还是COOKIE的问题,呵呵,我自己都忍不住要笑了 请问关于ADOQuery的一个问题! 急!!! 那儿有TApdComPort控件下载?
//代码如下,至于其它点击事件的处理,应该比较简单unit Unit1;interfaceuses
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.
http://www.cnvcl.org/index.php?lang=zh-cn
见意你试一下,比你用Image中图片好多了