2010-12-28 21 views
2

TreeViewノードの標準的なマウス動作(幅広いノード領域での選択、ホットトラッキング、ダブルクリックによる展開など)を拡張するにはどうすればよいですか?私は、システム描画された場合よりも広いラベルを持つカスタム描かれたノードを持っており、カーソルが通常のノード境界内にあるときにマウスのアクションに反応します。カスタムTreeNode境界

すべてのアイデア?

ところで、TVM_GETITEMRECTとTVM_HITTESTをインターセプトすることは、そのトリックを行いません。

私は何をしているのか、いくつかの言葉を書いています。通常、WinForms TreeViewとまったく同じように機能するWinFormsツリーコントロールを開発していますが、カスタムフォントと色をどのパーツにも適用できる特殊ノードそのラベルのだから、例えば、テキストに太字の単語があるノードを持つことができる、「RichTreeView」です。いくつかの重いフォントをつまずかせることで、ノードラベルは規則的なものよりも幅広くなるかもしれませんが、狭くなります(これはマウスの動作を抑える別の問題を引き起こします)。

答えて

2

はい、これはネイティブWindowsコントロールの問題です。カスタム項目境界を指定する方法はありません。 TVN_GETDISPINFO通知はおそらく最も近いですが、NMTVDISPINFOに境界を指定する方法がありません。 .NETラッパーはそれを実装しません。実際にVirtualModeを実装するだけで十分です。

これは、元のメトリックに基づいてヒットテストとTreeNode.Boundsを保持します。水平スクロールバーには特に問題があります。元のテキストよりも幅が広い場合は、すべてのカスタム描画テキストを表示するのに十分なほどスクロールしません。ヒットテストの問題は、MouseDownを実装してTreeNode.Boundsプロパティを反復することで多少解決できますが、スクロールバーの問題は解決できません。

これはクリーンな修正はありませんが、醜い修正のみです。 TreeNode.Textを、問題を解決するのに十分な幅の任意の文字列に設定します。必要に応じて、Tagプロパティを使用して実際のテキストを保存することができます。どのようにカスタムを描くかによって、TextのプレフィックスにMの数が十分にあるかもしれません。綺麗ではない。

+0

シャックス、私はそれを行うためのクリーンな方法がないと思った。そのダミーのテキストトリックは検討する価値があります。私はTreeNodeから派生したクラスを持っていて、標準のTreeViewに置いたときに標準のTreeNodeとまったく同じように動作したいので、Tagはプレースホルダとして使用できません。オプション)。より大きな問題は、非仮想テキストを通常どおりに動作させることです.TVM_SETITEMをトラップし、ダミーテキストを植えるのがうまくいくと思います。しかし、それはもっと醜い回避コードです。とにかくおかげさまで、私はこの1つでどのように汚いと思っているのか考える必要があります... –