Пожалуйста, помогите мне получить экранные координаты прямоугольника значка состояния заданного TTreeNode
в TreeView
(я имею в виду значки, указанные в свойстве TTreeView.StateImages
).Delphi, TTreeView: как получить координаты экрана данного узла и его значок?
Функция TTreeView.GetHitTestInfoAt(X, Y: integer): : THitTests
, но это не совсем то, что я ищу; он говорит, соответствуют ли заданные координаты метке или значку или значку состояния элемента, но мне нужно знать, какая часть значка была нажата.
(Причина в том, что я хочу, чтобы реализовать TreeView
узлов с двумя флажками для каждого элемента, и я использую StateImages
для имитации флажков (одно состояния проверенной вещи, другое состояние непроверенного пункта). Как я понять, какой щелкнуть по одному из этих флажков. Мне нужно сравнить координаты курсора с координатами значка состояния. Как я могу их получить?)
Вызов макросов намного проще, чем отправка сообщений. Но даже тогда вам не нужно явно отправлять сообщение TVM_GETITEMRECT, поскольку у Delphi есть ['TTreeNode.DisplayRect'] (http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.ComCtrls.TTreeNode .DisplayRect), который внутренне вызывает соответствующий макрос сообщения 'TVM_GETITEMRECT' и возвращает ограничивающий прямоугольник для узла дерева. – TLama
Спасибо большое! Это сработало! Вот код, который я сделал: 'использует CommCtrl; ... var 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_GETITEMRECT'. И будьте осторожны с таким кодом, потому что не всегда должен быть выбран какой-то узел, поэтому 'TTreeView.Selected' может быть' nil'. В любом случае, если это разрешило ваш вопрос, не забудьте [«принять ответ»] (http://meta.stackexchange.com/a/5235/179541). – TLama