高分悬赏Ttreeview CheckBox触发问题(200分)

S

saellen

Unregistered / Unconfirmed
GUEST, unregistred user!
前面已经有人讨论了在TTreeView中加入CheckBox的问题,按照下面这种方法可以解决,但有一个问题是:
单击CheckBox如何找到该CheckBox所对应的节点。请教各位大侠谢谢
procedure SetComCtlStyle(Ctl: TWinControl; Value: Integer; UseStyle: Boolean);
var
Style: Integer;
begin
if Ctl.HandleAllocated then
begin
Style := GetWindowLong(Ctl.Handle, GWL_STYLE);
if not UseStyle then Style := Style and not Value
else Style := Style or Value;
SetWindowLong(Ctl.Handle, GWL_STYLE, Style);
end;
end;
function IsNodeChecked(Node :TTreeNode) :Boolean;
const
TVIS_CHECKED = $2000;
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;

procedure SetNodeChecked(Node :TTreeNode; Checked :Boolean);
const
TVIS_CHECKED = $2000;
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;
 
占个位置,等一下再看
 
处理onmousedown事件,好像用getnodeat()
 
procedure TreeViewMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ANode: TTreeNode;
begin
if htOnStateIcon in TTreeView(Sender).GetHitTestInfoAt(X, Y) then
begin
ANode := TTreeView(Sender).GetNodeAt(X, Y);
if ANode <> nil then
SetCheckStateToNode(ANode);
end;
end;
 
这个东东一用,下面的滚动条就很长,特讨厌,一个“称”是最好的TreeView
www.digitalpublishing.de
在google上搜到的,你要可以给你源码,我还没用过,不过demo确实不错
 
http://www.digitalpublishing.de/english/


纠正楼上的,德语看不懂
 
多人接受答案了。
 
顶部