treeview控件上,在前面加勾的相关动作判断!高手请进,谢谢(50)

  • 主题发起人 主题发起人 jsw0525
  • 开始时间 开始时间
to:liuls首先非常感谢你的帮助,你说的和我的问题有有点区别的,看来我只有将代码贴出来才行了。我要的是如何判断鼠标是点击的前面的框框,这个框框是另外加上去的。具体代码如下,你可以拿这代码编译运行一下就非常清楚我要问的问题了。代码:procedure TForm1.Button1Click(Sender: TObject);var usertree_items: TTreeNode;begin treeview1.items.Add(nil, uppercase('JA.LZ.MIL')); usertree_items := treeview1.items[0]; treeview1.Items.Addchild(usertree_items,'qewqeq' ); SetWindowLong(treeview1.Handle, GWL_STYLE, GetWindowLong(treeview1.Handle, GWL_STYLE) or $00000100); //增加选择框end;
 
选择框,我是用 SetWindowLong(treeview1.Handle, GWL_STYLE, GetWindowLong(treeview1.Handle, GWL_STYLE) or $00000100);加上去的。现在就是要判断师鼠标是不是做选中或取消选择框的这个“动作”,还不需要判断鼠标点击树的其它部位。不知道现在我表达清楚了没谢谢
 
if htOnStateIcon in MyHitTest then这句代码就是判断是否点击选择框的。
 
to:ranyang你说的:“其实不必要和么复杂的!使用它的items的image index;selected index这个属性即可用图片来模拟选中框”完全不一样!items的image index是treeview这个控件所带有的属性,而前面这个框框treeview本身并没有,是通过 SetWindowLong(treeview1.Handle, GWL_STYLE, GetWindowLong(treeview1.Handle, GWL_STYLE) or $00000100); 加上去的。鼠标点击image index和前面的框框是两回事,现在要区分开来
 
首先非常感谢你各位的帮助,看来大家还是没有真正理解我的问题,我只有将代码贴出来才行了。我要的是如何判断鼠标是点击的前面的框框,这个框框是另外加上去的。具体代码如下,你可以拿这代码编译运行一下就非常清楚我要问的问题了。代码:procedure TForm1.Button1Click(Sender: TObject);var usertree_items: TTreeNode;begin treeview1.items.Add(nil, uppercase('JA.LZ.MIL')); usertree_items := treeview1.items[0]; treeview1.Items.Addchild(usertree_items,'qewqeq' ); SetWindowLong(treeview1.Handle, GWL_STYLE, GetWindowLong(treeview1.Handle, GWL_STYLE) or $00000100); //增加选择框end;请大家拿这点代码拷贝到你的机器运行一下就知道了,只要在上面加一个treeview控件,把名字改为treeview1就可以编译,就可以看到运行界面了
 
我理解你的意思了!没仔细看[:(!]等我研究一下[:D]
 
好的,谢谢,希望各位继续探讨,帮忙
 
即使采用第3方控件,也没有类似checkbox的事件,还是判断不了:点击了复选框还是点击了项目呀谁知道不落
 
~~~~~~~~那是我项目里的代码~~~~. 你只要 OnMouseMove 事件里, 当鼠标移动什么样的位置时, 看一下它会进哪一个 case 条件了
 
我试过了, japhe 正解...// 测试代码如下procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var Node: TTreeNode; P: TPoint; aSet: THitTests;begin Node := TreeView1.Selected; if Node = nil then Exit; if not GetCursorPos(P) then Exit; // 得到光标的位置 P := TreeView1.ScreenToClient(P); // ComCtrls 单元 TTreeView的各个位置都枚举出来了 // THitTest = (htAbove, htBelow, htNowhere, htOnItem, htOnButton, htOnIcon, // htOnIndent, htOnLabel, htOnRight, htOnStateIcon, htToLeft, htToRight); aSet := [htAbove, htBelow, htNowhere, htOnItem, htOnButton, htOnIcon, htOnIndent, htOnLabel, htOnRight, htOnStateIcon, htToLeft, htToRight] * TreeView1.GetHitTestInfoAt(P.X, P.Y); if aSet <> [] then // 在此行设断点, 当你点中框时, 看 aSet 集合里都有哪几项 Caption := 'Yes' else Caption := '';end;// 另外你通此句加上去的框框,其实也是一个图片,只不过是 Windows 自带的而已 SetWindowLong(treeview1.Handle, GWL_STYLE, GetWindowLong(treeview1.Handle, GWL_STYLE) or $00000100); //增加选择框
 
to:liuls感谢你这么晚了,还给我 回答问题.procedure TForm1.Button1Click(Sender: TObject);var usertree_items: TTreeNode;begin treeview1.items.Add(nil, uppercase('JA.LZ.MIL')); usertree_items := treeview1.items[0]; treeview1.Items.Addchild(usertree_items,'qewqeq' ); SetWindowLong(treeview1.Handle, GWL_STYLE, GetWindowLong(treeview1.Handle, GWL_STYLE) or $00000100); //增加选择框end;请你拿这点代码拷贝到你的机器运行一下就知道了,只要在上面加一个treeview控件,把名字改为treeview1就可以编译,就可以看到运行界面了结果用你的测试代码还是不行,发现的问题:当鼠标选则框框,或者后面的内容时, if aSet <> [] then // 在此行设断点, 看 aSet 集合里的项不稳定,会变化.有时选择框框和选择后面的内容,aSet 集合里面的值一样.麻烦你再在你哪测试一下落.我的QQ:27958870谢谢
 
japhe 正解...japhe 正解...japhe 正解...japhe 正解...japhe 正解...// 测试代码如下procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var Node: TTreeNode; P: TPoint;begin Node := TreeView1.Selected; if Node = nil then Exit; if not GetCursorPos(P) then Exit; // 得到光标的位置 P := TreeView1.ScreenToClient(P); if htOnStateIcon in TreeView1.GetHitTestInfoAt(P.X, P.Y);then Caption := 'Yes' else Caption := '';end;
 
各位朋友,问题已解决,非常感谢各位的帮助,谢谢了现将请各位领分!辛苦各位大虾了
 
分数各位领到了没有,好象没有给出样的
 
后退
顶部