パイプとノードのネットワークを生成するために、C#/wpf でアプリのようなペイントを作成しようとしています。必要な機能の 1 つは、ユーザーがノードをクリックするか、ノードの上にマウスを置いたときにノードの色を変更することです (2 つの異なるハイライト色)。
現在、グラフィックス コードは次のように構成されています。
ノードのグローバル リストとNode.list
、リストをループして各ノードの座標を読み取り、その値に楕円を配置するペイント イベントがあります。(描画面として機能する組み込みの winform パネルがあるため、ペイント イベントはレンダリングされません) ポイントがまだ存在しない描画面をクリックすると、新しいノードが追加されNode.list
、ペイント イベントがトリガーされます。存在する場所をクリックすると、座標やその他のプロパティを調整できるメニューが表示されます。また、isHighlighted
bool プロパティを true に設定します。このプロパティでは、ペイント イベントのロジックがポイントをキャッチしてさまざまな色で描画します。ペイント イベント コードは次のとおりです。
Node nodes = new Node();
for (int q = 0; q < Node.list.Count; q += 1)
{
nodes = Node.list[q];
if(Node.list[q].redHL) //Clicked
{
g.FillEllipse(black, Convert.ToInt32(nodes.xCord) - 8, Convert.ToInt32(nodes.yCord) - 8, 19, 19);
g.FillEllipse(red, Convert.ToInt32(nodes.xCord) - 6, Convert.ToInt32(nodes.yCord) - 6, 15, 15);
}
else //Regular Nodes
{
g.FillEllipse(black, Convert.ToInt32(nodes.xCord) - 8, Convert.ToInt32(nodes.yCord) - 8, 19, 19);
g.FillEllipse(yellow, Convert.ToInt32(nodes.xCord) - 6, Convert.ToInt32(nodes.yCord) - 6, 15, 15);
}
if (Node.list[q].yellowHL) //Hovered
{
g.FillEllipse(black, Convert.ToInt32(nodes.xCord) - 8, Convert.ToInt32(nodes.yCord) - 8, 19, 19);
g.FillEllipse(blue, Convert.ToInt32(nodes.xCord) - 6, Convert.ToInt32(nodes.yCord) - 6, 15, 15);
}
}
ポイントにカーソルを合わせると色が変わるようにコードを設定しようとするまで、このアプローチは非常にうまく機能していました。最初に試したのは、次のようにマウス移動イベントに if ステートメントを配置することでした。
row = pointExists(e.X, e.Y);
if(row != -1)
/* Highlight point */
Node.list.Count[row].isHighlighted = true;
else
/* unhighlight all points */
for(u = 0; u > Node.list.Count; u += 1)
Node.list[u].IsHighlighted = false;
これは機能します...しかし、マウスが移動するたびにペイントイベントがトリガーされるため、画面が狂ったように点滅します!
マウスが最初に領域を離れたときにのみペイントイベントがトリガーされ、成功するように、いくつかのロジックを設定しようとしました...一種。私は上記からこのfranken-logic-statementに行きました:
if (row != -1 )
{
if (Node.inRegion)
{
Node.lastNode = row;
for (int u = 0; u < Node.list.Count; u += 1)
Node.list[u].yellowHL = false;
Node.list[row].yellowHL = true;
Node.inRegion = false;
Node.outRegion = true;
wfSurface.Invalidate();
}
}
else
{
if (Node.outRegion)
{
if (Node.lastNode != 0)
Node.list[Node.lastNode].yellowHL = false;
Node.inRegion = true;
Node.outRegion = false;
wfSurface.Invalidate();
}
}
正確ではありません。
上記は、さらにロジックを投入しなければならないまで機能しました。ユーザーがノードを描画したい場合、「ユーザーがリンクの開始点を選択したか」などの他の条件をスローする必要があります。これにより、ノードが強調表示される色やタイミングが変更されます。
これをどのように行うのが最善かについて、誰にもアイデアがありますか? 私はこの男の方法をチェックしてみました:
http://www.codeproject.com/Articles/8494/DrawTools
しかし、彼の情報源を 20 分間調べた直後にあきらめました (アプリは複雑すぎて理解できませんでした)。私はこれを完全に間違っていると思います...上記の記事で、ユーザーが描画されたグラフィックをクリックしたかどうかを確認するためにヒットテストを使用することについて言及しました。ノードがすでにそこに描画されているかどうかを確認するために、座標のリストを照会しましたが、ややハッキーな解決策です...これについては、よりインテリジェントな方法が必要です。
みんなありがとう、
猟師