〜 OpenGLプラットフォーム「ヒスイ」 チュートリアル 〜
2007年09月 作成
2010年12月 修正
2011年09月 修正
今までのチュートリアルで作成してきたプログラムのメイン関数を見てみてください。
static void Main()
{
...
Application.Run( new Hisui.Gui.MainForm() );
}
このように、フォームは Hisui.Gui.dll に定義済みの MainForm クラスを利用していました。このチュートリアルでは、定義済みの MainForm を利用しないで自分でフォームを定義していきます。つまり、次のようにフォームクラスを自作し、
using System.Windows.Forms;
class MyForm : Form { ... }
メイン関数を次のように書き換えます。
static void Main()
{
...
Application.Run( new MyForm() );
}
フォームにヒスイのビューを組み込む前に、メインメニューを作成しておきましょう。
class MyForm : Form
{
public MyForm()
{
this.Controls.Add( Hisui.SI.CreateMainMenu() );
}
}
CreateMainMenu() 関数により、プラグインされたコマンド群からメインメニューが自動生成されます。
Hisui.Gui.dll をオブジェクトブラウザで見ると、ViewPanel や SingleViewPanel といったコントロールが定義されていることが分かります。ViewPanel がベースクラスで、その派生として SingleViewPanel と QuadViewPanel が定義されています。Hisui.Gui.MainForm のビュー部分はこの ViewPanel クラスが担っています。まずは ViewPanel コントロールを利用して MyForm を定義していきましょう。
次のように SingleViewPanel コントロールを MyForm に配置します。
class MyForm : Form
{
Hisui.Gui.ViewPanel _view = new Hisui.Gui.SingleViewPanel();
public MyForm()
{
this.Controls.Add( Hisui.SI.CreateMainMenu() );
_view.SetUp( Hisui.SI.DocumentViews );
_view.Dock = DockStyle.Fill;
this.Controls.Add( _view );
}
}
あるいは、フォームデザイナで ViewPanel コントロールを MyForm に貼り付けることも可能です。
その場合には、まず VisualStudio のツールボックスにヒスイのコントロールを登録する必要があります。ツールボックス上で右クリックしてコンテキストメニューを表示し、「アイテムの選択」をクリックします。すると次のようなダイアログが表示されます。
右下の「参照」ボタンをクリックして、Hisui.Gui.dll を登録しましょう。合わせて Hisui.Graphics.dll も登録しておくと良いでしょう。
以上の操作により、ViewPanel コントロールがツールボックスに表示されたはずです。その ViewPanel コントロールを MyForm に貼り付ければ OK です。
次に、ビルドグラフのルートノードとして ViewPanel コントロールを登録します。ViewPanel コントロールは Hisui.Core.IBuild インターフェイスを実装しているのです。ViewPanel をビルドグラフに組み込むことにより、ビルドグラフの更新のたびに表示要素(シーン)などが適切に更新されるようになります。
public MyForm()
{
this.Controls.Add( Hisui.SI.CreateMainMenu() );
_view.Dock = DockStyle.Fill;
this.Controls.Add( _view );
Hisui.SI.Tasks.Add( _view ); // ビルドグラフに登録
Hisui.SI.Rebuild(); // ビルドグラフを更新
}
ヒスイでは、例えば直線作図などのオペレーションの最中に ESC キーを押すとそのオペレーションから離脱することが出来ます。これを実現するためには、次のように KeyDown イベントのハンドラを記述する必要があります。
public MyForm()
{
...
Hisui.Graphics.ViewManager.Events.KeyDown +=
delegate( object sender, KeyEventArgs e )
{
if ( e.KeyCode == Keys.Escape && Hisui.SI.Driver.IsActive ) {
Hisui.SI.Driver.Abort();
Hisui.SI.Document.SelectedEntry = null;
if ( Hisui.SI.Document.History.CanCancel )
Hisui.SI.Document.History.Cancel();
else
Hisui.SI.Build();
Hisui.SI.View.Invalidate();
}
};
}
このコードを書く代わりに、Hisui.SI.SetupEscapeKeyCancelation() を利用することも出来ます。
public MyForm()
{
...
Hisui.SI.SetupEscapeKeyCancelation();
}
実は、この辺りのもろもろの処理を行う Hisui.SI.SetupMainForm() という関数が用意してあります。次のように使用すればOKです。
public MyForm()
{
...
Hisui.SI.SetupMainForm( this, "タイトル文字列" );
}
この関数は、下記の初期化を行います。
上の例では MainForm クラスこそ利用していませんが、結局は Hisui.Gui.dll に定義済みの ViewPanel を利用しています。ここでは Hisui.Gui.dll は一切使用しないで、Hisui.Graphics.dll に定義された GLViewControl を直接利用する方法を説明します。
Hisui.Graphics.GLViewControl を次のように MyForm に配置すればOKです。
class MyForm : Form
{
Hisui.Graphics.GLViewControl
_view = new Hisui.Graphics.GLViewControl();
public MyForm()
{
...
// ビューをフォームに配置
_view.Dock = DockStyle.Fill;
this.Controls.Add( _view );
// ビューを DocumentViews に設定し、ビルドグラフに組み込む
Hisui.SI.DocumentViews.AddView( _view );
Hisui.SI.Tasks.Add( Hisui.SI.DocumentViews );
this.Controls.Add( Hisui.SI.CreateMainMenu() );
}
}
必要ならば座標軸のシーンをシーングラフに追加してください。
public MyForm()
{
...
// 座標軸
_view.SceneGraph.WorldScenes.Add( new Hisui.Graphics.Scenes.AxisScene() );
}
上記の内容では説明し切れていない部分がたくさんあります。
ヒスイ1.4より、Hisui.Gui.dll のソースコードを公開することにしました。更に深く理解したい方は、src/Hisui.Gui/ 以下のソースコードを読み解いてみてください。
Copyright © 2010, 株式会社カタッチ
http://www.quatouch.com