![]() |
![]() |
![]() ![]() ![]()
DEVELOPERS' WORKSHOP: BeOSプログラミングの基礎: Part 1 「Developers' Workshop」は、開発者から寄せられる質問に対する解答を提供する、新しい週次の特集です。 毎週、Be社の技術サポートや文書化担当者が実際の開発者から寄せられた質問の中から一つ(あるいは二つ)を選び、答えを提供します。
インテル向けBeOSのリリースが近づくにつれ、全くの新たなBeOSプログラマーが未知の領域に入るべく準備を進めています。 彼らがBeOSアプリケーションを書くことを助けるために(そして、PowerPCプログラマーがBeOSを始めることを助けるために)、私のBe Newsletterの記事では、今後の数回にわたって、BeOSプログラミングの簡単な紹介を行います。 今週は、きわめて基礎的なアプリケーションを作ります。 あなたは「Hello, World?」と言えますか。 この記事と我々の作るサンプル・アプリケーションで、これをどうやって実現するのかを説明します。 ええ、その通りです。我々はBeOSアプリケーションとして「Hello World」を書くことになります。 我々は、アプリケーション、ウィンドウならびにビュー・オブジェクトを生成して、テキストをビューの中に描画します。 この記事では、あなたが知っておくべきことをすべて説明する訳ではありませんが、あなたが実験をはじめられるように、少なくともあなたを目覚めさせ、最初のアプリケーション開発を進められるようにすることが必要になります。 実際、この記事を読み進める上で、あなたはBe Developer's Guideやオンライン版Be Bookを手もとに置いておくべきです。 このプロジェクトのために、以下のヘッダ・ファイルをソース・コードにインクルードしておく必要があります: #include <Application.h> #include <Window.h> #include <View.h> それでは最初から始めましょう: BApplicationクラス。 このクラスは、BeOSアプリケーションを定義します。 本質的に、BApplicationクラスは、あなたのアプリケーションとアプリケーション・サーバーのリンクを表現します。 アプリケーション・サーバーは、大部分のアプリケーションが扱う必要があるメッセージング、イメージング、あるいは他のよい材料を取り扱います。 それで、あなたがスクリーン上に描画をしたり、メッセージを受けたり送ったりすることを可能にする上で、あなたはBApplicationオブジェクトを生成しなければなりません。 典型的なやり方としては、BApplicationから派生したあなた自身のクラスを生成することによってこれを実現します。したがって、あなたは特定のメソッドを拡張したりオーバーライドすることにより、アプリケーションの動作をカスタマイズすることができます。 Hello Worldプログラムの中で、我々はこの目的を果たすHelloAppという名前のクラスを生成することにします。 アプリケーションの void main(void) { HelloApp *theApp; // 我々のアプリケーション・オブジェクトに対するポインター theApp = new(HelloApp); theApp->Run(); delete theApp; } ここで いったん グローバル変数be_appは、常にあなたのアプリケーションのBApplicationオブジェクトを指すことを覚えておくとよいでしょう。 これが意味することは、必要が無ければアプリケーション・オブジェクトへのポインターを保持し続けておく必要が無いということです。ただし、あなたがオブジェクトに独自に実装したメソッドを呼び出す場合は、あなたのクラスに対してbe_appをキャストする必要があります。 それではHelloAppクラスを見てみましょう: class HelloApp : public BApplication { public: HelloApp(); private: HelloWindow *theWindow; }; 先ほど述べた通り、HelloAppはBApplicationから派生しています。 我々はただ我々がする必要があることをされるためにコンストラクタを必要とするだけですので、それは我々が定義するただpublicメソッドだけを持ちます。 単一のプライベート変数であるtheWindowが、我々のアプリケーションのウィンドウへのポインターを保持するために使われます。 HelloAppコンストラクタを調べてみましょう: HelloApp:: HelloAppコンストラクタは、文字列「application/x-vnd.Be-HelloWorld」を渡して、BApplicationコンストラクタに従います。 この奇妙な外見の文字列は、アプリケーションのシグネチャです。 これにより、このアプリケーションがアプリケーションであり、ベンダがBe社であることが指定されます。 アプリケーションの名前は、「HelloWorld」です。 これは、我々がアプリケーションを識別する際の標準的な手段です; 他のプログラムは、この文字列を使って、あなたのアプリケーションを捜し出し、それにメッセージを渡すことができます。 オブジェクトが構築されたら、次にBRectを生成します。 BRectは矩形オブジェクトです(Be Developer's GuideのInterface Kitの章に詳しい記述があります)。 これはスクリーン上で矩形の上端、左端、右端、そして下端を与えることによって矩形エリアを定義するために使われ、矩形の位置やサイズを指定したり、検索したりするためのいくつかのメソッドを持ちます。 これらのメソッドの一つが そのBRectオブジェクトは、我々がウィンドウ・オブジェクトを生成する際に、HelloWindowコンストラクタに渡されます; この矩形は、ウィンドウの生成時に、これをスクリーン上に配置し、サイズを決定するために使われます。 我々がHelloAppのtheWindowフィールドにウィンドウ・ポインターを保存する点に注意して下さい。 ここまでの議論で、HelloWindowクラスに目を通す必要が生じてきました: class HelloWindow : public BWindow { public: HelloWindow(BRect frame); virtual bool HelloWindowクラスはコンストラクタを一つ持ち、これはBRectオブジェクトを一つの引数(前の方で検討したように)として受け取ります。また、 HelloWindow::HelloWindow(BRect frame) : BWindow(frame, "Hello World", B_TITLED_WINDOW, B_NOT_RESIZABLE|B_NOT_ZOOMABLE) { AddChild(new HelloView(Bounds())); Show(); } 上に示したコンストラクタは、ウィンドウをセットアップするために、BWindowコンストラクタに従います。
フレーム矩形は、コンストラクタに対する引数として指定され、コンストラクタに渡されます。また、ウィンドウの名前は文字列「Hello World」によって指定されます。
ウィンドウが造られたら、次に我々はビューをウィンドウに付け加える必要があります。 ビューは、他のビューを格納します。 これは面白い概念であり、理解しておくべき重要な概念の一つです。 ウィンドウは、ビューを格納します。 あなたは、ウィンドウ内に直接描画することはできません。 あなたは、まずビューを生成して、それをウィンドウに付与する必要があります。 一つのウィンドウに対して、必要なだけの数のビューを付着することができ、各ビューはさらにサブ・ビューを持つことができます。 我々は、次回の記事でこれをさらに探求します。 今のところ、我々のアプリケーションのウィンドウは、一つのビューを持ちます。 我々の例では、ビューのサイズをウィンドウのサイズとぴったり同じにし、完全にウィンドウを覆うようにします。
したがって、我々がHelloView(これについては、まもなく検討します)を実体化する場合、我々は 境界矩形[値]は、あるウィンドウによって占有された領域を示しますが、そのウィンドウに対するローカル座標で表されます。 これは、把握しておくべきもう一つの重要な概念です。 あなたのコンピュータが640x480[ピクセル]のスクリーンを持つとすると、スクリーンの上左端の座標は(0,0)となり、スクリーンの下右端は(640,480)となります。 これらは「スクリーン座標系」と呼ばれます。 あなたがウィンドウを生成する場合、あなたはスクリーン座標系を使って、スクリーン上でのウィンドウの位置を指定します。 いったんウィンドウが生成されたら、あなたがそのウィンドウ内で何をしても、それは「ローカル座標系」上でなされます スクリーン座標系がスクリーンの上左端を(0,0)とするように、ローカル座標系ではウィンドウの上左端を(0,0)とします。 BWindowクラスの 我々はこのBRectをHelloViewコンストラクタに渡すので、ビューはウィンドウ全体を覆います。 我々は、次にHelloViewクラスを研究します。 newにより戻り値を受け取ったHelloViewポインターは、次いでBWindowの いったん子ビューがウィンドウに付け加えられたら、我々は 我々がHelloWindowクラスのために定義するもう一つのメソッドが bool HelloWindow::QuitRequested() { be_app->PostMessage(B_QUIT_REQUESTED); return true; } これは、非常に単純です。
我々は、単にアプリケーションに対して 次に、我々はウィンドウを閉じる許可を与えるために、trueを返します。
最後に、BViewから派生しているHelloViewクラスを見てみましょう。 ビューは、全ての描画がされる背景です。 class HelloView : public BView { public: HelloView(BRect frame); virtual void Draw(BRect updateRect); }; 我々のHelloViewクラスはコンストラクタを持っており、これはビューがその親の範囲内で占めるべきサイズと位置を示すBRectを受け取り、アプリケーション・サーバーがビューの内容をアップデートする場合に呼び出す コンストラクタは、このようになります: HelloView::HelloView(BRect frame) : BView(frame, "HelloView", B_FOLLOW_ALL_SIDES, B_WILL_DRAW) { } ご覧の通り、我々はコンストラクタの中で何もしません:
我々は単にフレーム矩形を渡すだけで、BViewコンストラクタに従います。
ビューの名前は、「HelloView」です。
我々は、リサイジングモード用に アプリケーション・サーバーは、ウィンドウの内容がアップデートされる必要があるときはいつでも、 void HelloView::Draw(BRect updateRect) { MovePenTo(BPoint(20,75)); // ペンを移動 DrawString("Hello, world!"); } お分かりのように、Hello Worldでは、我々はupdateRectを無視しています。
我々はBPointオブジェクト(これはスクリーン上の点を表します)をその座標系で生成することによって、ペンを座標(20,75)に置き、それから いったんペンが所定の場所に置かれたら、我々は 私の記事のためのサンプル・コードは、Be社のFTPサイトの以下の場所に置かれる予定です: ftp://ftp.be.com/pub/samples/preview/intro/helloworld_article.zip 次回は、あなたが一つのウィンドウ中で複数のビューをどのように使うことができるかを研究し、いくらかの基礎的なユーザー・インタフェース機能の研究を始めます。
差し当たってはBe Developer's Guideや、
Copyright ©1997 Be, Inc. Be is a registered trademark, and BeOS, BeBox, BeWare, GeekPort, the Be logo and the BeOS logo are trademarks of Be, Inc. All other trademarks mentioned are the property of their respective owners. Comments about this site? Please write us at webmaster@be.com. |