Delphi,TTreeView:如何获取给定节点及其图标的屏幕坐标?

Delphi,TTreeView:如何获取给定节点及其图标的屏幕坐标?,delphi,treeview,ttreenodes,Delphi,Treeview,Ttreenodes,请帮助我获取TTreeView中给定TTreeNode的状态图标矩形的屏幕坐标(我指的是TTreeView.StateImages属性中指定的图标) 有一个TTreeView.gethittestInfo(X,Y:integer)::THitTests函数,但这不是我想要的;它表示给定的坐标是否对应于标签、图标或项目的状态图标,但我需要知道单击了图标的哪个部分 (原因是我想实现TreeView节点,每个项目有两个复选框,我使用statemages模拟复选框(一个状态是选中的项目,另一个状态是未选

请帮助我获取
TTreeView
中给定
TTreeNode
的状态图标矩形的屏幕坐标(我指的是
TTreeView.StateImages
属性中指定的图标)

有一个
TTreeView.gethittestInfo(X,Y:integer)::THitTests
函数,但这不是我想要的;它表示给定的坐标是否对应于标签、图标或项目的状态图标,但我需要知道单击了图标的哪个部分


(原因是我想实现
TreeView
节点,每个项目有两个复选框,我使用
statemages
模拟复选框(一个状态是选中的项目,另一个状态是未选中的项目)。据我所知,要知道单击了哪个复选框,我需要将光标坐标与状态图标坐标进行比较。如何获取它们?

您可以向控件发送一条消息,告知项目边界框的客户端坐标。使用该值以及您所知道的标签文本和图标的相对位置来确定鼠标在图标中单击的位置

您可能更愿意发送一条消息,而不是
gethittestinfo
,因为它会立即为您提供命中测试信息和项目句柄;句柄是
tvm\u GetItemRect
所需的


您不需要屏幕坐标,因为到目前为止涉及的所有坐标都是客户机坐标,但如果确实需要屏幕坐标,您可以调用。

调用宏比发送消息容易得多。但即使这样,您也不需要显式发送
TVM_GETITEMRECT
消息,因为Delphi有一种方法,它可以在内部调用相应的
TVM_GETITEMRECT
消息宏并返回树节点的边框。非常感谢!成功了!下面是我编写的代码:
使用CommCtrl。。。变量R:TRect;pItemRect:指针;开始pItemRect:=@R;HTREEITEM(pItemRect^):=TreeView.Selected.ItemId;SendMessage(TreeView1.Handle、TVM_GETITEMRECT、WParam(true)、LParam(pItemRect))-将所选项目文本的坐标放入
R
。因此,图标的右X坐标是
R.Left-4
(图标和文本之间有3个空白像素)。现在您可以简化代码以使用
TreeView.Selected.DisplayRect
,因为
DisplayRect
方法只是
TVM\u GETITEMRECT
消息的包装器。并且要小心使用这些代码,因为并非总是必须选择某个节点,因此
t视图。selected
可能是
nil
。无论如何,如果这解决了你的问题,别忘了。@TLama,哦,是的,这个方法给出的结果是一样的。非常感谢。无论如何,我在发送消息方面有一些额外的练习:)