2013-09-01 3 views
7

Пожалуйста, помогите мне получить экранные координаты прямоугольника значка состояния заданного TTreeNode в TreeView (я имею в виду значки, указанные в свойстве TTreeView.StateImages).Delphi, TTreeView: как получить координаты экрана данного узла и его значок?

Функция TTreeView.GetHitTestInfoAt(X, Y: integer): : THitTests, но это не совсем то, что я ищу; он говорит, соответствуют ли заданные координаты метке или значку или значку состояния элемента, но мне нужно знать, какая часть значка была нажата.

(Причина в том, что я хочу, чтобы реализовать TreeView узлов с двумя флажками для каждого элемента, и я использую StateImages для имитации флажков (одно состояния проверенной вещи, другое состояние непроверенного пункта). Как я понять, какой щелкнуть по одному из этих флажков. Мне нужно сравнить координаты курсора с координатами значка состояния. Как я могу их получить?)

ответ

6

Вы можете отправить сообщение tvm_GetItemRect, в котором будут указаны координаты клиента ограничивающей рамки элемента. Используйте это и то, что вы знаете об относительных положениях текста ярлыка и значков, чтобы определить, куда щелкнули мышь в значке.

Вместо GetHitTestInfoAt вы можете предпочесть отправить сообщение tvm_HitTest, так как оно даст вам информацию об испытаниях и рукоятке элемента одновременно; ручка - это то, что требуется tvm_GetItemRect.

Вам не нужен экран , так как все координаты, которые были задействованы до сих пор, являются координатами клиента, но вы можете позвонить ClientToScreen, если вам действительно нужны координаты экрана.

+2

Вызов макросов намного проще, чем отправка сообщений. Но даже тогда вам не нужно явно отправлять сообщение TVM_GETITEMRECT, поскольку у Delphi есть ['TTreeNode.DisplayRect'] (http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.ComCtrls.TTreeNode .DisplayRect), который внутренне вызывает соответствующий макрос сообщения 'TVM_GETITEMRECT' и возвращает ограничивающий прямоугольник для узла дерева. – TLama

+0

Спасибо большое! Это сработало! Вот код, который я сделал: 'использует 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 пустых пикселя). –

+0

Теперь вы можете упростить свой код, чтобы использовать 'TreeView.Selected.DisplayRect', потому что метод' DisplayRect' является просто оболочкой для сообщения 'TVM_GETITEMRECT'. И будьте осторожны с таким кодом, потому что не всегда должен быть выбран какой-то узел, поэтому 'TTreeView.Selected' может быть' nil'. В любом случае, если это разрешило ваш вопрос, не забудьте [«принять ответ»] (http://meta.stackexchange.com/a/5235/179541). – TLama