0

作業中のアプリケーションのマインド マッピングの外観を作成しようとしています。そこでは、ボックスを線または矢印でリンクする必要があります。

これは私がこれまでに持っているものです:

私がこれまでに持っているもの

そして、これが私が達成したいことです:

ここに画像の説明を入力
ボックスを移動してサイズを変更することはできますが、何日もの試行錯誤と調査の結果、ユーザーがボックスにリンクを追加し、線を再計算して、ユーザーが移動したときに角度/長さを変更する方法がわかりません。周りのボックス。

このアプリの一部では Direct2D を使用していますが、時間の制約から、自分でボックスのレンダリングを開始したくありません。

VirtualTreeView を使用してあまり視覚的でない TreeView に戻すつもりでしたが、これを機能させたいと思っています。

誰かがこれを達成する方法についてのヒントを提供したり、使用できる既存のコンポーネントを知ったりできますか?

ありがとう!

4

2 に答える 2

1

Sertac Akyus がコメントで悲しんでいるように、必要なのは線を引くための 2 つの基準点だけです。

また、LineTo コマンドを使用して、ボックスの親コントロールのキャンバスに簡単に線を引くことができます。

あなたの例を見てみましょう。Box1 と Box2 の間に線を引くには、次の手順を使用します。

//Move point to the bottom midle of the Box1
Parent.Canvas.MoveTo(Box1.Left+(Box1.Width div 2),Box1.Top+Box1.Height);
//Draw a line to the top middle of the Box2
Parent.Canvas.LineTo(Box2.Left+(Box2.Width div 2),Box2.Top);

ここで、ラインが必ずしもそれを横切るのではなく、その境界にのみつながるように、どのコントロールがより高いかに特別な注意を払う必要があります。

次のように、あるボックスの中心点から別のボックスの中心点まで線を引くだけで、生活を少し楽にすることもできます

//Move point to the center of first box
Parent.Canvas.MoveTo(Box1.Left+(Box1.Width div 2),Box1.Top+(Box1.Height div 2));
//Draw a line to the center point of second box
Parent.Canvas.LineTo(Box2.Left+(Box2.Width div 2),Box2.Top+(Box2.Height div 2));

しかし、これは最初のアプローチほど良く見えないかもしれません。

とにかく、マインド グラフを使用すると、遅かれ早かれ、直線を描くだけでは不十分な状況に遭遇する可能性があります。

そのような場合は、曲線の描画 (少なくとも S 字曲線の描画) のサポートを提供する必要があります。これらを使用して、ユーザーが他のボックスを横切らないように適切に調整できるようにする必要があります。ただし、それには、ユーザーが特定の行を選択してから、その特定のプロパティを調整する機能が必要です。

もう 1 つの高度な方法として、曲線の自動描画があります。このようなアプローチでは、バックグラウンドでパスファインディング アルゴリズムを使用して、可能なライン パスを表す複数の参照ポイントを見つけ、次にこれらの参照ポイントを介して Catmul-Rom スパインをレンダリングする機能を使用します。

残念ながら、私はまだ自分で実装しようとしているので、この高度なアプローチのコード例を提供することはできません.

于 2015-02-13T20:11:51.270 に答える