Be Inc.の提供するプログラミング・チュートリアルの日本語訳第2弾でございます。この訳文の文責は、長田正彦にございます。翻訳には慎重を期したつもりですが、おかしな点、間違い等に気づかれた場合には、私までメールを頂けると幸いです。
![]() |
![]() ![]() ![]() | ||
プログラミングの手引:January 範囲この手引は、初心者であるBe開発者向けのものです。 C++についての知識を仮定しています。 取り上げるのは、以下の話題です:
注: このファイルは、テキスト形式でftp://ftp.be.com/pub/Samples/jan_tutorial.txtに置いてあります。この手引きを読みながらBeBookを読む/復習する事によって、あなたの学習経験をより効果的なものにできます..... 序論Januaryプログラムは、ウィンドウ内に、一月のカレンダーを表示します。 加えて、カレンダーはウィンドウがリサイズされた場合、動的に再描画します。 ソース・ファイル解説
プロジェクトBeOS開発環境は、開発者が、プロジェクトファイルを作成し、これをIDEと共に用いる事により、プロジェクトやコンパイル情報やコマンドをグラフィカルに表現する事を可能にします。 UNIXの世界からやって来た人のために、makefileやコマンド・ラインでのコンパイルもサポートされています。 Januaryプロジェクトは、両方の例を与えます。
この場合、CodeWarriorユーザは「January.proj」ファイルを開く訳ですが、一方のUNIXファンは、ターミナルを立ち上げて、Januaryディレクトリに
アプリケーション・フレームワーク
ベース・アプリケーション・クラスは、 main() { BTSApplicationWindow *aWindow; BRect aRect; // We can use a standard BApplication object, because // we don't have anything special to add to what it does // by default. BApplication *myApplication; myApplication = new BApplication('JANR'); // set up a rectangle and instantiate a new window aRect.Set(20, 20, 200, 200); aWindow = new BTSApplicationWindow(aRect); // Once everything is setup, start running the application. myApplication->Run(); // Delete the application object before exiting. delete(myApplication); return(0); } アプリケーション固有のウィンドウ
ウィンドウを生成するすべてのアプリケーションは、 class BTSApplicationWindow : public BWindow { public: BTSApplicationWindow(BRect frame); virtual bool QuitRequested(); }; メソッドは、二つだけ定義されます。 コンストラクタをオーバーライドすることにより、下記のように、ウィンドウ内にカレンダーを生成するコードを挿入する事が出来ます:
BTSApplicationWindow::BTSApplicationWindow(BRect frame) : BWindow(frame, "January", B_TITLED_WINDOW, 0) { BRect aRect = frame; // rect same size as window. BTSMonthView *aView; // Move rect so top left is a (0,0) aRect.OffsetTo(B_ORIGIN); aView = new BTSMonthView(aRect, "MonthView"); // Lock the window before altering contents. Lock(); // add view to window AddChild(aView); // Unlock after done altering window contents. Unlock(); // make window visible Show(); }
我々は
この他の、通常と異なるものは、
描画は全て、実際には bool BTSApplicationWindow::QuitRequested() { // Tell the application to quit! be_app->PostMessage(B_QUIT_REQUESTED); return(TRUE); }
ユーザがいかなる手段でウィンドウを閉じる場合でも、 ユーザー・インタフェースを表示するいかなるアプリケーションも、最後のウィンドウが閉じる時に、終了しなくてはなりません。 これがされないと、アプリケーションのメインメニューは消えてしまい、ユーザの理解している方法でプログラムを終了することができなくなります。 あなたがこの種の機能を必要とする場合、あなたは「ダミーの」BWindowオブジェクトを生成し、これを隠し、プログラムが終了する時には、これを削除するだけにしなくてはなりません。 あなたが複数のウィンドウを持つのであれば、ウィンドウの数を勘定し続けて、カウントが0になった時、プログラムを終了する必要があります。 この問題は、BeOSの後のリリースで解消される予定です。 この時点で、我々は基礎的なアプリケーション・フレームワークを生成します; メインおよびアプリケーション・ウィンドウに対するのと同一の定義を、あらゆる単一ウィンドウのアプリケーションに使う事ができます。 唯一変更する必要があるのは、我々がウィンドウのコンストラクタ内で、ウィンドウに挿入する事になるビューです。 グラフィックスと動的にリサイズするビュー
グラフィックスに関するしかけは、すべて
BTSMonthView::BTSMonthView(BRect frame, char *name) : BView(frame, name, B_FOLLOW_ALL, B_FULL_UPDATE_ON_RESIZE|B_WILL_DRAW|B_FRAME_EVENTS) { fBackgroundGraphic = new BTSMonthGraphic(this); SetViewColor(B_TRANSPARENT_32_BIT); }
コンストラクタの中でなされる必要があるのは、カレンダーを表現しているグラフィックス・オブジェクトである
ここで使われる特定のフラグは、以下の事を指定します:
動的なリサイズは簡単です; 我々は void BTSMonthView::FrameResized(float new_width, float new_height) { fBackgroundGraphic->SetSize(BPoint(new_width, new_height)); } 描画
最後に、描画です! カレンダーのグラフィックは、グリッド【格子】によって表現されます。
ウィンドウのリサイズに伴って、グリッドの間隔も変ります。
新しい格子間隔に基づいて、カレンダーの上のいろいろなラベルのためのフォント・サイズとテキスト【書体の事か?】は選択されます。
我々は、 void BTSMonthGraphic::SetSize(BPoint size) { fSize = size; Invalidate(); } void BTSMonthGraphic::Invalidate() { // Do the resizing magic // Re-calculate the various size things CalculateParameters(); CalculateDayLabels(); // Make sure the view draws itself fImageNeedsUpdate = 1; }
よろしい...あまり詳細には立ち入らない様にする事にして、
BeOS上での描画は、アプリケーション自身以外によってされるのではなく、アプリケーション・サーバーでなされます。
app serverは、別個のプロセスであり、これのコピーの一つは、常に動いています。
(あなたは、ターミナル・ウインドウを立ち上げて、コマンド「ps | grep app_server」を実行する事で、これを見ることができます。
全ての描画コマンドは、実行のためにapp serverに伝えられます。
この速度を上げるために、線描コマンドは配列としてまとめる事が出来るので、app serverはもっと迅速な方法でこれら【のコマンド】を実行する事が出来ます。
これは、
fView->BeginLineArray(7); for (counter = 1; counter < 7; counter++) { BPoint startPoint(xStart+(counter*GridCellSize.x)-2,yStart); BPoint endPoint(xStart+(counter*GridCellSize.x)-2,yEnd); fView->AddLine(startPoint, endPoint, blackColor); } fView->EndLineArray();上記コードは、結果として、app serverとの七つの小さな通信の代わりに、一つの大きな通信となります。 しかし、 EndLineArray() を呼ばずにAddLine() を余りに何度も呼び出すと、配列のメモリ・オーバーヘッドのために、パフォーマンスが落ちるかもしれません。
(BeBookでは、256以下を推奨しています)。
描画コマンドからの実際の描画の分離は、重要な問題をもたらします;
プログラマは、描画命令が実際に何時実行されたのかをどうやって知るのでしょう?
多くの場合、app serverは受け取って直ぐには描画コマンドを実行しないかもしれません。
app serverに、特定のビューに対する全ての描画要求の完了を強制するために、ビューの BTSStringLabel
void BTSStringLabel::Draw(BView* aView) { if (fNeedsCalculation) Recalculate(aView); // Setting font info aView->SetFontName(fFontInfo.name); aView->SetFontSize(fFontInfo.size); aView->SetFontShear(fFontInfo.shear); aView->SetFontRotation(fFontInfo.rotation); aView->SetHighColor(fColor); aView->MovePenTo(fStartPoint); aView->DrawString(fString); }
IconWorldIconWorldは、あなたのアプリのための、基礎的なリソースの構成をするために使われます。 BeOSユーザーズ・ガイドのIconWorldについての節には、この事が非常に詳しく書かれています。 マックの開発者であれば、これをBeOS用のResEditであると考えて下さい。扱えるリソースの数ははるかに少ないですが。 IconWorldを使って、January.rsrcを開いて下さい。 「App Info」メニューの下で、フラグ「単一の起動[Single Launch]」がセットされている事に注意してください。 これが意味する事は、一実行可能ファイル当り一つの、【セットがなされた】アプリケーションのコピーが実行可能だ、という事であって、これは「排他的起動[Exclusive Launch]」に対するもので、これはシステム空間、および実行期間中、ただ一つのアプリケーションだけが実行可能というものです。【意味不明】 もちろん、「複数の起動」が意味するのは、同一のアプリが同一システム上で複数回起動出来るという事です。 この場合、「単一の起動」の選択は任意でしたが、これが非常に重要になるアプリもあるかもしれません。 アイコンの型が、それがアプリケーションと関連することを意味する『BAPP』である点に注意してください。 このアプリがそれに関連した文書を持つのであれば、文書を表現する、別のアイコンを作る事も出来ますし、そのアイコンに、文書ファイルのシグネチャに合った型を与える事も出来ます。 IconWorldを閉じてください。
プロジェクトのビルドと実行あなたは、BeOSユーザーズ・ガイドとMetrowerks文書を、アプリケーションの構築に関する完全な詳述として参照することができます。 下記は、手順の短い概要です。 今、あなたは基礎的なアプリケーション・フレームワークを手にしたので、これをあなた自身のアプリケーションの出発点として利用出来ます。 Beの従業員も彼らの子も、この手引の執筆中に、エピソード(発射出来ようとそうでなかろうと)を吐露することに熱中していませんでした【意味不明】。 我々は、同じことがあなたにもあてはまることを望みます。 UNIXユーザのために
Januaryディレクトリの中で、「 copyres $(RESOURCE_FORK) $@ setfile $@ 最初の行は、単にファイルの最後にリソース情報を追加します。 二番目の行は、BeOSに、新しく生成されたプログラムが実行可能形式である事を知らせます。 CodeWarriorユーザのために プロジェクト・メニューから「Make」を選んでください。 あなたがそれを実行したいならば、「Run」を選択してください。
| |||
著作権©;1997年 Be社、 Beは登録商標です、そして、BeOS、BeBox、BeWare、GeekPort、BeロゴとBeOSロゴはBe社の商標です。 他に言及された全ての商標は、それらの各々の所有者の所有物です。 このサイトについてコメントがありますか? webmaster@be.com宛に書いてください。 ここで使われたアイコンは、Be社の所有物です。不許複製。
| |||
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. Icons used herein are the property of Be Inc. All rights reserved.
日本語訳:長田 正彦(osada@st.rim.or.jp) 翻訳文中 【○○○】 の形式で記された部分は、訳者のコメントおよび補足です。 |