Women in Technology

Hear us Roar



Article:
  How to Write a Basic Gtk# Program with Mono
Subject:   How to Write a Basic Gtk# Program with Mono.
Date:   2004-09-13 04:15:01
From:   Trackback from http://mikeforce.homelinux.org/blog/archives/2004_09.html#a000108 anonymous2
部屋を掃除していたら、以前印刷した O'REILLY ONLamp.com に掲載された "How to Write a Basic Gtk# Program with Mono" の紙切れが出てきたので、とりあえず翻訳してみた:


Mono を使った、基本的な Gtk# プログラムの書き方


編集者のメモ: O'Reilly の最新刊 Mono: A Developer's Notebook には、ざっと 50 近い mini-projects が掲載されており、バージョン 1.0 リリースにおいて最も重要な点やある程度やむを得ない制限事項などが紹介されています。この本では、Windows 上に Mono をインストールする手順や、Gtk# がどのように動くのか、そしてシンプルな Gtk# プログラムの書き方などが記述されており、まさに mini-projects を並べて紹介しているような構成になっています。


Gtk# は、GTK+ ユーザ・インタフェース・ツールキットに対する Mono API です。対して、Mono では Windows.Forms も実装しています。Gtk# は完全なオープンソースな代替物であり、Linux 上で Mono のプログラムを実行するためのルック&フィールの選択肢です。このラボでは Mono を Windows にインストールする手順とシンプルな Gtk# プログラムの書き方について実例をまじえて説明しています。


ユーザ・インタフェースを構築するツールキットでは、ユーザからプログラムへイベントを配送する方法を定義しています。プログラマの指示に従ってプログラムを制御する非対話式プログラムに対して、対話式プログラムではプログラムで受け取るイベントに反応しなければなりません。


Gtk# では、プログラムを制御する流れはメイン・イベント・ループによって握られています。プログラムは自分の制御をメイン・ループへ譲って入力イベントを処理させます。イベントが発生したときはいつでも、それらのイベント・ハンドラが呼び出され、メイン・プログラムへ制御を渡します。



Mono は Common Language Runtime (共通言語ランタイム) のオープンソースな実装です。
Gtk# ユーザ・インタフェース・ライブラリを含んでいます。






関連図書:
Mono: A Developer's Notebook
共著: Edd Dumbill、Niel M. Bornstein




どうすれば良いのか?
最初に、お使いのコンピュータに Mono と Gtk# をインストールして下さい。Mono の Windows 版インストーラは http://go-mono.com/download.html からダウンロードできます。Gtk# の Windows 版インストーラは http://gtk-sharp.sourceforge.net/ にあるリンクをたどるとあります。
Mono は未だ積極的に開発されているので、問題が定期的に発生します。http://www.nullenvoid.com/gtksharp/wiki/index.php/InstallingBeginnersGuideForWindows にある Gtk# Windows 版ビギナーズ・ガイドを確認し、ダウンロードした Gtk# のバージョンに応じて与えられた指示に従って下さい。



お使いのコンピュータの C:\Windows フォルダにある、
Visual C++ のランタイム msvcr70.dll を確認しておいて下さい。
これは Microsoft 〓 のサイトから自由にダウンロードできます。



次にインストールした Mono を格納したサブ・フォルダ (たとえば C:\Program Files\Mono-0.31\bin) を参照するよう、環境変数 MONO_PATH をセットします。さらに環境変数 PATH にも、このフォルダを追加しておいてください。これで Mono のインストールが完了しました。それでは、ウィンドウを一つ、ボタンを一つ持った基本的な #Gtk# プログラムを構築することにしましょう。このウィジットは共にイベントを発行して、プログラマが処理したい内容を記述したハンドラを追加してみます。


サンプル2: 基本的な Gtk# アプリケーション: 01-basics/Main.cs



// 04-gtk/01-basics
using System;
using Gtk;
class MainClass {
public static void Main (string[] args)
{
Application.Init ();
Window w = new Window ("Gtk# Basics");
Button b = new Button ("Hit me");
w.DeleteEvent += new DeleteEventHandler (Window_Delete);
b.Clicked += new EventHandler (Button_Clicked);
// GUI の初期化
w.Add (b);
w.SetDefaultSize (200, 100);
w.ShowAll ();
Application.Run ();
}
static void Window_Delete (object o,
DeleteEventArgs args)
{
Application.Quit ();
args.RetVal = true;
}
static void Button_Clicked (object o,
EventArgs args)
{
System.Console.WriteLine ("Hello, World!");
}
}



通常のテキスト・エディタを使って、ソース・コードを Main.cs として保存して、次のようにコンパイルします:



% mcs Main.cs -pkg:gtk-sharp
Compilation succeeded
% mono Main.ext



-r:gtk-sharp は Gtk# アッセンブリを参照するよう指示するコンパイラ・オプションです。
このオプションを省略すると、コンパイラは Gtk クラスがどこにあるのか分からなくなります。



コンパイルが完了したアプリケーションを実行すると、図8にあるようなウィンドウを見ることができるでしょう: ボタンはウィンドウの余白一杯に広がって配置されています。ボタンを数回クリックすると、図9のように端末上に表示される出力を見ることができます。



図8. ボタンが付いた Gtk# ウィンドウ



図9. 端末の出力


どのように動いているのか?
Gtk の名前空間は Gtk を使って実装されています。ツールキットを初期化する基本的な Gtk# の処理はアプリケーション・クラスが実行しています。特に、興味を引く三つのスタティックなメソッドがあります。



Init() は Gtk# ライブラリを初期化します。これを行わない限り何も始まりません。
Run() は制御の流れをメインのイベント・ループに移します。
Quit() は制御が返ってきたらイベント・ループを終了します。



あなたのアプリケーションで、グラフィックスを利用することが可能かどうかを
チェックさせたい場合は、Init() メソッドのかわりに InitCheck() メソッドを
利用してみてください。この方法だと、ひどい失敗を起こさずにテキスト・インタフェース
へフォールバックすることができます。



ウィンドウとボタンの生成に関しては、それほど大げさなものではないです: もっと興味深いサンプルが他のラボにありますから。ここでもっとも重要なことは、イベント・ハンドラのフッキングです。Gtk# の各ウィジット (ユーザ・インタフェースの要素) は、いろいろなイベントを発行することが可能です。それらの多くは、Gtk# ウィジットの全ての派生元である、基本ウィジット・クラスから配送されています。フォーカスを含め基本的なイベントは、ウィジットがユーザのフォーカスを受け取ると発行され、DeleteEvent はウィジットが削除されたら発行されます。


イベントが発生すると、それに対応したハンドラが呼び出されます。イベントには、いくつかのハンドラを割り当てることが可能です。サンプル2では、ハンドラ Window_Delete をイベント DeleteEvent に追加しています。



イベント・ハンドラが一個のオブジェクト・インスタンスにアクセスする場合、
スタティックなメソッドである必要はありません。
インスタンスによって prefixed されるハンドラの割り当てを行うことだけが
違います。



ここで取り上げたハンドラ Window_Delete は興味深い二つの処理を行います。一番目は、制御が戻ってきたらメイン・ループを終了させます。二番目に、オブジェクト args を介して返り値として ture を返しています。これは、これ以降にイベントを受け取ったハンドラの処理を停止させます。


ボタンのハンドラもまったく同様で、汎用ウィジットのイベント・ハンドラそのものです。ボタンは特殊なイベントをいくつか持っており、その一つである Clicked は一番便利です。


ハンドラの割り当てについては、その下に横たわる実装へのヒントを与えることで完全なものになります。しかしながら、ショートカットを用いることも可能です。これは Mono で実装されている C# 2.0 の機能 "anonymous methods" からきており、次のように二行記述します:



w.DeleteEvent += Window_Delete;
b.Clicked += Button_Clicked;



What about......