2013-09-01 23 views
7

TTreeNodeの状態アイコン矩形の画面座標をTreeView(私はTTreeView.StateImagesプロパティで指定されたアイコンを意味します)に取得してください。Delphi、TTreeView:与えられたノードとそのアイコンの画面座標を取得する方法は?

TTreeView.GetHitTestInfoAt(X, Y: integer): : THitTests機能がありますが、それは私が探しているものではありません。指定された座標がラベル、アイコン、またはアイテムの状態アイコンに対応するかどうかを示しますが、アイコンのどの部分がクリックされたかを知る必要があります。

(理由は、私は、各項目について2つのチェックボックスとTreeViewノードを実装することで、私は(一つの状態がチェックされた項目であり、他の状態がチェック項目である)チェックボックスをシミュレートするためにStateImagesを使用する。Iとしてどのチェックボックスがクリックされたかを知るために、私はカーソル座標を状態アイコン座標と比較する必要があります)

答えて

6

コントロールを送信することができますtvm_GetItemRectメッセージは、アイテムの境界ボックスのラベルテキストとアイコンの相対的な位置を知っているものを使用して、アイコン内でマウスがクリックされた場所を特定します。

GetHitTestInfoAtの代わりに、tvm_HitTestメッセージを送信することをお勧めします。これは、ヒットテスト情報とアイテムハンドルを同時に提供するためです。ハンドルはtvm_GetItemRectに必要なものです。

これまでに関与するすべての座標は、クライアント座標ですが、あなたが本当にスクリーン座標をしたい場合は、ClientToScreenを呼び出すことができますので、あなたは画面座標を必要としません。

+2

メッセージを送信するよりもマクロを呼び出す方が簡単です。しかし、それでも、Delphiには '' TTreeNode.DisplayRect'(http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.ComCtrls.TTreeNode)があるので、明示的に 'TVM_GETITEMRECT'メッセージを送る必要はありません。 .DisplayRect)メソッドを呼び出して、対応する 'TVM_GETITEMRECT'メッセージマクロを内部的に呼び出し、ツリーノードの境界矩形を返します。 – TLama

+0

ありがとう!出来た!ここに私が作ったコードがあります: 'CommCtrlを使います。 ... var R:TRect; pItemRect:ポインタ; begin pItemRect:= @R; HTREEITEM(pItemRect ^):= TreeView.Selected.ItemId; SendMessage(TreeView1.Handle、TVM_GETITEMRECT、WParam(true)、LParam(pItemRect)); ... ' - 選択した項目テキストの座標を' R 'にします。したがって、アイコンの右のX座標は「R.左-4」(アイコンとテキストの間に3つの空白のピクセルがあります)です。 –

+0

'DisplayRect'メソッドは単に' TVM_GETITEMRECT'メッセージのラッパーにすぎないので、 'TreeView.Selected.DisplayRect'を使うようにコードを単純化することができます。そのようなコードには注意が必要です。なぜなら、必ずしもあるノードを選択しなければならないわけではないので、 'TTreeView.Selected'は' nil'です。とにかく、それがあなたの質問を解決したら、[答えを受け入れる]ことを忘れないでください(http://meta.stackexchange.com/a/5235/179541)。 – TLama

関連する問題