私は、この種のことを行う GUI を備えたいくつかのアプリを開発しました。
私が最も満足しているのは、VASE と呼ばれるものです。これは、プロセス フロー シミュレーターのレイアウトの作成、パラメーターの設定、および結果の表示に使用される GUI です。
これは簡単な作業ではありませんが、1 つまたは 2 つの作業を行うと、再利用できる多くのアイデアがあり、すぐに完了します。
2 つの最大の課題は、オブジェクトを接続する線を描画すること (ご覧のとおり、VASE でも、この問題は完全には解決されていません) と、そのレイアウトを簡単に復元して再描画できる形式で保存することです。
サポートが必要な特定の問題はありますか?
開始するために非常に単純な例が必要な場合は、いくつかの基本的な機能を再実装しました (すべて素晴らしくきれいで、著作権の制限はありません) - 左クリックで選択、ドラッグして移動、右クリックで接続。
ここにソースコードリポジトリがあります -http://66.199.140.183/cgi-bin/vase.cgi/home
これがどのように見えるかです
私は単純化されたコネクタを実装しました。これをパイプと呼びます。この種のことを行う方法の風味を与えるために、ユーザーが右クリックしたときにパイプを追加するコードを次に示します
/**
User has right clicked
If he right clicks on a flower
and there is a different flower selected
then connect the selected flower to the right clicked flower
if he right clicks on empty background
create a new flower
*/
void cVase::MouseRightDown( wxMouseEvent& event )
{
// find flower under click
iterator iter_flower_clicked = find( event.GetPosition() );
// check there was a flower under click
if( iter_flower_clicked != end() ) {
// check that we have a selected flower
if( ! mySelected )
return;
// check that selected flower is different from one clicked
if( mySelected == (*iter_flower_clicked) )
return;
// construct pipe from selected flower to clicked flower
myPipe.push_back(cPipe( mySelected, *iter_flower_clicked ));
} else {
// no flower under click
// make one appear!
cFlower * pflower = Add();
pflower->setLocation( event.GetPosition() );
}
// redraw everything
Refresh();
}
そして、ここにパイプを描くコードがあります
/**
Draw the pipe
From starting flower's exit port to ending flower's entry port
*/
void cPipe::Paint( wxPaintDC& dc )
{
dc.SetPen( *wxBLUE_PEN );
dc.DrawLine( myStart->getExitPort(), myEnd->getEntryPort() );
}
ソース コード リポジトリを参照すると、これらすべてを結び付ける残りの wxWidgets コードを確認できます。