TTreeNode
の状態アイコン矩形の画面座標をTreeView
(私はTTreeView.StateImages
プロパティで指定されたアイコンを意味します)に取得してください。Delphi、TTreeView:与えられたノードとそのアイコンの画面座標を取得する方法は?
TTreeView.GetHitTestInfoAt(X, Y: integer): : THitTests
機能がありますが、それは私が探しているものではありません。指定された座標がラベル、アイコン、またはアイテムの状態アイコンに対応するかどうかを示しますが、アイコンのどの部分がクリックされたかを知る必要があります。
(理由は、私は、各項目について2つのチェックボックスとTreeView
ノードを実装することで、私は(一つの状態がチェックされた項目であり、他の状態がチェック項目である)チェックボックスをシミュレートするためにStateImages
を使用する。Iとしてどのチェックボックスがクリックされたかを知るために、私はカーソル座標を状態アイコン座標と比較する必要があります)
メッセージを送信するよりもマクロを呼び出す方が簡単です。しかし、それでも、Delphiには '' TTreeNode.DisplayRect'(http://docwiki.embarcadero.com/Libraries/XE2/en/Vcl.ComCtrls.TTreeNode)があるので、明示的に 'TVM_GETITEMRECT'メッセージを送る必要はありません。 .DisplayRect)メソッドを呼び出して、対応する 'TVM_GETITEMRECT'メッセージマクロを内部的に呼び出し、ツリーノードの境界矩形を返します。 – TLama
ありがとう!出来た!ここに私が作ったコードがあります: '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つの空白のピクセルがあります)です。 –
'DisplayRect'メソッドは単に' TVM_GETITEMRECT'メッセージのラッパーにすぎないので、 'TreeView.Selected.DisplayRect'を使うようにコードを単純化することができます。そのようなコードには注意が必要です。なぜなら、必ずしもあるノードを選択しなければならないわけではないので、 'TTreeView.Selected'は' nil'です。とにかく、それがあなたの質問を解決したら、[答えを受け入れる]ことを忘れないでください(http://meta.stackexchange.com/a/5235/179541)。 – TLama