SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

アプリケーション上のオブジェクトの位置、大きさ、形を自由に変更可能にする方法

ユーザー主導でアプリケーションの外観を決定

有用性を発揮する例

 任意のオブジェクトを移動/サイズ変更するアルゴリズムは、プログラミングの多くの局面で必要とされますが、ここでは2つの例を紹介します。このアルゴリズムが特に有用性を発揮する分野は、科学技術関係のプログラムです。

 こうしたアプリケーションを社内用としてだけでなく、販売目的で設計するときは、ユーザーの人数の方が開発者の人数よりも何倍も多くなります。どのような設計を提案しても、すべてのユーザーがそれで満足することは考えられず、開発工程で開発者とユーザーの間に議論が始まり、やがて論戦が激化して喧嘩にまで発展するものです。ユーザー側のインターフェース要件が正反対であることも珍しくなく、固定的なインターフェースを追求しても袋小路に陥ります。しかし、ユーザー主導タイプのアプリケーションなら、問題はまったくありません。移動可能/サイズ変更可能なオブジェクトによって、この問題は抜本的に解決されます。ユーザー自身が自由にアプリケーションの外観を変更できるので論争の余地はありません。悩ましきインターフェースの問題は、これで終わるに違いありません。

 Form_GraphsAndComments.csは、移動可能/サイズ変更可能なオブジェクトを使って、この種のアプリケーションをどのように構成すればよいかを示しています(図4)。科学関係のアプリケーションでは、計算結果を示す各種のグラフ領域と、その分析に使われる情報(大抵表形式)を表示することがよくあります。固定的な設計を採用した場合は、グラフの個数と表示位置を開発作業の初期段階で検討し、後になってそれを変更することはほぼありません。これは研究活動にとって非常に厳しい制約です。移動可能/サイズ変更可能なオブジェクトを採用すると、この種のアプリケーションの設計と利用方法が抜本的に変化します。開発者は、計算を正確に行い、その結果を簡単に出力することだけに専念できます。一方、ユーザーは画面のどこに何をどう表示するかを決定し、それはユーザーが主体となって決めるものとなります。ここで取り上げたフォームは、仕組みを簡単に理解できるよう配慮して単純化してありますが、実際、もっと複雑な科学関係のアプリケーションでも構成の仕方は似ています。

図4 科学関係のアプリケーションは通常、グラフ領域と、補助データを表示するコントロールで構成される
図4 科学関係のアプリケーションは通常、グラフ領域と、補助データを表示するコントロールで構成される

 このサンプルプログラムでは、リスト中の関数を選ぶとデータが選択されるようになっており、実に単純明快です。これ以外の点は、ユーザー主導タイプのどの科学アプリケーションにも共通する要件を満たしています。

  • フォームの大きさを自由に変更できる
  • フォームに、いくつでもグラフを表示できる
  • 各グラフに、いくつでも関数をプロットできる
  • グラフ領域を自由に移動/サイズ変更できる
  • すべての表示パラメータを簡単に変更できる
  • コメントを簡単に追加、削除、変更、移動できる
  • すべての視覚情報を簡単に、いろいろな方法で保存できる

 設計側から提示した制約は一切ありません。完全にユーザー主導のアプリケーションです。必要と思ったことを何でも自由に行えます。

 前に示した多角形とコメントの例は、多角形とコメントの同時移動と独立移動が行える2階層のシステムでした。それに対して、このグラフ領域のサンプルはメインのグラフ領域と縮尺線とコメントから成る3階層のシステムに分類されますが、それ以外はまったく同じで、グラフにもIntoMover()メソッドがあります。グラフ領域に(縦方向と横方向の両方で)複数の縮尺線を与えることができ、「親」であるグラフ領域の任意の場所に縮尺線を配置でき、任意のグラフ領域と縮尺線に任意個のコメントを置くことができ、それぞれのコメントは固有の表示パラメータを持つことができます。このように何層もの自由度を与えても、3つのマウスイベントから成るコードは以前と変わらず単純です。関係するオブジェクトがいくら複雑でも、それでアルゴリズム自体が複雑になることはありません。使い方も実装方法も前と変わらず非常に簡単です。科学アプリケーションの分野では、分析のさまざまな段階で研究者が結果を手作業で調節するという非常に高度な技が求められます。このような移動可能/サイズ変更可能な要素に基づくアプリケーション設計にすると、アプリケーションの制御権をよりふさわしい相手(つまりユーザー)に与えることができます。結局のところ、こうしたアプリケーションを使用するのは各研究分野の専門家の方であり、プログラムの開発者ではありません。制御権はより詳しい専門知識を持つユーザーに与えるべきです。

 この例でも、やはり3つのマウスイベントが次のような非常に簡単な形で使われます。

 MouseDownイベントでオブジェクトをつかみます。

private void OnMouseDown (object sender, MouseEventArgs mea)
{
    ptMouse_Down = mea .Location;
    mover .Catch (mea .Location, mea .Button, bShowAngle);
    ContextMenuStrip = null;
}

 MouseMoveイベントでオブジェクトを移動します。

private void OnMouseMove (object sender, MouseEventArgs e)
{
    if (mover .Move (e .Location))
    {
        Invalidate ();
    }
}

 MouseUpイベントで、以前つかんだオブジェクトを解放します。操作するオブジェクトによって異なるコンテキストメニューを表示するため、このメソッドの中で適切なメニューの選択を行います。

private void OnMouseUp (object sender, MouseEventArgs mea)
{
    ptMouse_Up = mea .Location;
    double nDist = Auxi_Geometry .Distance (ptMouse_Down, ptMouse_Up);
    if (mea .Button == MouseButtons .Left)
    {
        if (mover .Release ())
        {
            int iInMover = mover .WasCaughtObject;
            if (mover [iInMover] .Source is MSPlot)
            {
                Identification (iInMover);
                if (nDist <= 3 && iAreaTouched > 0)
                {
                    MoveScreenAreaOnTop (iAreaTouched);
               }
            }
        }
    }
    else if (mea .Button == MouseButtons .Right)
    {
        if (mover .Release ())
        {
            if (nDist <= 3)     // ContextMenu if nDist <= 3
            {
                MenuSelection (mover .WasCaughtObject);
            }
        }
        else
        {
            if (nDist <= 3)
            {
                iAreaTouched = -1;
                ContextMenuStrip = contextMenuOnEmpty;
            }
        }
    }
}

 メニューの選択自体は非常に原始的なものです。識別方法は単純で、初期化の段階ですべてのオブジェクトに一意のIDを与えています。

private void MenuSelection (int iInMover)
{
    Identification (iInMover);
    if (iAreaTouched >= 0)
    {
        if (mover [iInMover] .Source is MSPlot)
        {
            ContextMenuStrip = contextMenuOnPlot;
        }
        else if (mover [iInMover] .Source is Scale)
        {
            ContextMenuStrip = contextMenuOnScale;
        }
        else if (mover [iInMover] .Source is TextMR)
        {
            ContextMenuStrip = contextMenuOnComment;
        }
    }
}

 財務分析のアプリケーション(Form_Medley.cs、図5)も同じタイプです。

図5 さまざまな財務グラフ
図5 さまざまな財務グラフ

 財務関係のグラフはもっと種類が多く、科学関係のグラフよりも回転が多用されるでしょう。しかし、設計全般に違いはありません。グラフのクラスが増えるので、コンテキストメニューの数も多くなります(このフォームには10個のメニューがあります)。そのため、MenuSelection()のコードは多少長くなりますが、それでも以前と同じ程度に単純です。移動可能/サイズ変更可能な要素に基づくアプリケーションは、どんなに複雑でも基本的な考え方に違いはありません。

  • オブジェクトの個数はユーザーの意向によってのみ決定され、いつでもコンテキストメニューでオブジェクトを追加または削除できる
  • オブジェクトを移動するには、オブジェクト内部の任意の点をつかむ
  • オブジェクトのサイズ変更は、その境界上の点で行う。一連の同軸リングについては、各リングの境界にもこれが適用される
  • 財務グラフの各クラスは、固有のテキスト情報体系を持つ。オブジェクト全体に関連付けられるテキストと、オブジェクトの各要素に関連付けられるテキストがある。個々のテキスト情報は独立して移動/回転でき、「親」の移動または回転と同時に移動または回転することもできる
  • 数多くある表示パラメータのすべてを簡単に調節できる。パラメータの調節は、個別に行うことも、サンプルのように同列のものをまとめて行うことも、さらにすべての「子」についてまとめて行うこともできる

 これらの例はすべてForm_Medley.csのコードにあります。

結論

 本稿では、すべてのオブジェクトを移動可能/サイズ変更可能にするアルゴリズムと、そのオブジェクトに基づくアプリケーションの設計について考察しました。さらに詳しい説明はwww.sourceforge.netのMoveableGraphics project(大文字と小文字が区別されることに注意!)にあります。Test_MoveGraphLibraryアプリケーションに多くのサンプルがあります(このプロジェクトのコードはすべて入手可能)。また、Moveable_Resizable_Objects.docにサンプルの説明があります。このアプリケーションの個々のサンプルは、アルゴリズムの各部分を、簡単な例からより複雑な例へと段階的に説明するように意図されています。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Sergey Andreyev(Sergey Andreyev)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4605 2009/12/15 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー