我是通过下面语句加了复选框的 SetWindowLong(mapTreeView.Handle, GWL_STYLE , GetWindowLong(mapTreeView.Handle, GWL_STYLE) or $00000100);现在面临的是怎样判断是否在节点前打勾了呢?
TreeView1.GetHitTestInfoAt(X, Y) in [htOnButton]
因为在学习,所以就想用TreeView来实现 各位多帮忙,谢谢啦
function GetTreeNodeChecked(Node:TTreeNode):Boolean; var vItem : TTVItem; begin vItem.mask:=TVIF_HANDLE or TVIF_STATE; vItem.hItem:=Node.ItemId; vItem.stateMask:=TVIS_STATEIMAGEMASK; TreeView_GetItem(Node.TreeView.Handle,vItem); Result:=Boolean((vItem.state shr 12)-1); end; 问下:我编译时,为什么提示TTVItem未定义呢? Undeclared identifier:'TTVItem'
好,接下来要做三件事, 1、在FormCreate事件中 加入如下代码 var dw: DWORD; begin dw := GetWindowLong( TreeView1.Handle, GWL_STYLE); dw := dw or TVS_CHECKBOXES; SetWindowLong(TreeView1.Handle, GWL_STYLE , dw); end;
2、加两个函数 function SetTreeViewNodeChecked(ATreeView: TTreeView; ATreeNode: TTreeNode; Checked: Boolean): Boolean;
function GetTreeViewNodeChecked(ATreeView: TTreeView; ATreeNode: TTreeNode): Boolean;
第一个用来设置一个节点的是否被Check 第二个用来取得一个节点的Check状态。
3、就是这两个地实现代码了。
function SetTreeViewNodeChecked(ATreeView: TTreeView; ATreeNode: TTreeNode; Checked: Boolean): Boolean; var tvItem: TTVItem; begin tvItem.mask := TVIF_HANDLE or TVIF_STATE; tvItem.hItem := ATreeNode.ItemId; tvItem.stateMask := TVIS_STATEIMAGEMASK;
(*Image 1 in the tree-view check box image list is the unchecked box. Image 2 is the checked box.*) if Checked then tvItem.state := IndexToStateImageMask(2) else tvItem.state := IndexToStateImageMask(1);
Result := TreeView_SetItem(ATreeView.Handle, tvItem); end;
function GetTreeViewNodeChecked(ATreeView: TTreeView; ATreeNode: TTreeNode): Boolean; var tvItem: TTVItem; begin // Prepare to receive the desired information. tvItem.mask := TVIF_HANDLE or TVIF_STATE; tvItem.hItem := ATreeNode.ItemId; tvItem.stateMask := TVIS_STATEIMAGEMASK;
// Request the information. TreeView_GetItem(ATreeView.Handle, tvItem);
// Return zero if it's not checked, or nonzero otherwise. Result := Boolean((tvItem.state shr 12) - 1); end;
SetWindowLong(mapTreeView.Handle, GWL_STYLE
, GetWindowLong(mapTreeView.Handle, GWL_STYLE) or $00000100);现在面临的是怎样判断是否在节点前打勾了呢?
各位多帮忙,谢谢啦
var
vItem : TTVItem;
begin
vItem.mask:=TVIF_HANDLE or TVIF_STATE;
vItem.hItem:=Node.ItemId;
vItem.stateMask:=TVIS_STATEIMAGEMASK;
TreeView_GetItem(Node.TreeView.Handle,vItem);
Result:=Boolean((vItem.state shr 12)-1);
end;
问下:我编译时,为什么提示TTVItem未定义呢?
Undeclared identifier:'TTVItem'
壳参看: http://www.cnblogs.com/del/archive/2008/05/15/1198645.html
这样控制起来就是完全自己掌握了
需要预先准备打勾和没打勾(或灰色勾)的小图到imagelist
把treeview1.stateimage设为这个imagelist
节点.stateindex==1就是打勾,节点.stateindex==2就是没打勾
节点的鼠标点击事件里判断是不是点在stateimage模拟的这个复选框上,是则切换该节点的stateindex
如果想同时选择或清除所有子节点的复选框,也就在此事件里递归进行
如果想同时决定上级节点的复选框(子节点部分选中,父节点复选框为灰色勾),也可以在此事件里判断实现
首先当然是要在Form加一个TTreeView控件咯。:)
然后在单元的公共uses部分加一个Commctrl单元。
好,接下来要做三件事,
1、在FormCreate事件中
加入如下代码
var
dw: DWORD;
begin
dw := GetWindowLong( TreeView1.Handle, GWL_STYLE);
dw := dw or TVS_CHECKBOXES;
SetWindowLong(TreeView1.Handle, GWL_STYLE , dw);
end;
2、加两个函数
function SetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode; Checked: Boolean): Boolean;
function GetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode): Boolean;
第一个用来设置一个节点的是否被Check
第二个用来取得一个节点的Check状态。
3、就是这两个地实现代码了。
function SetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode; Checked: Boolean): Boolean;
var
tvItem: TTVItem;
begin
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem := ATreeNode.ItemId;
tvItem.stateMask := TVIS_STATEIMAGEMASK;
(*Image 1 in the tree-view check box image list is the
unchecked box. Image 2 is the checked box.*)
if Checked then
tvItem.state := IndexToStateImageMask(2) else
tvItem.state := IndexToStateImageMask(1);
Result := TreeView_SetItem(ATreeView.Handle, tvItem);
end;
function GetTreeViewNodeChecked(ATreeView: TTreeView;
ATreeNode: TTreeNode): Boolean;
var
tvItem: TTVItem;
begin
// Prepare to receive the desired information.
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem := ATreeNode.ItemId;
tvItem.stateMask := TVIS_STATEIMAGEMASK;
// Request the information.
TreeView_GetItem(ATreeView.Handle, tvItem);
// Return zero if it's not checked, or nonzero otherwise.
Result := Boolean((tvItem.state shr 12) - 1);
end;