第2回 始めにBApplicationありき


さて今回から実際にBeプログラムを始めます。
BeOSアプリでは必ずBApplicationというクラスの実態(インスタンス)をつくる必要があります。
BApplicationのインスタンスを作成しないと、BeOSのウィンドウやボタンなどといった機能が利用できません。
まずは、ソースを見てください。

// sample1.cpp

#include <Application.h> // BApplicationを使うために必要
#include <Alert.h>       // BAlertを使うために必要

class MyApp : public BApplication
{
public:
	MyApp();
	virtual void ReadyToRun(); // 初期化が完了したときに呼ばれるメンバ関数
};

MyApp::MyApp()
      :BApplication("application/x-vnd.big56-MyApp")
{
// メッセージボックスを出す
	BAlert* alert;
	alert = new BAlert("タイトル","Hello World","お約束");
	alert->Go();
}

void MyApp::ReadyToRun()
{
// アプリケーションを終了する
	Quit();
}

int main(int argc,char** argv)
{
 	MyApp app;
	app.Run();
	return 0;
}

今回のプログラムを実行すると、以下のようなメッセージボックス(BeOS風にいうとアラートパネル)が開いたと思います。

実行結果

それでは解説をしていきたいと思います。

上のプログラムではBApplicationからMyAppというクラスへpublic継承をしています。
BeOSプログラムは、

BeOSがシステムで用意しているクラスを継承して、自分のアプリケーション用にカスタマイズして使う。

というのが定石です。
MyAppではコンストラクタとReadyToRun()というメンバ関数を再定義しています。
コンストラクタのコードは次の様になっています。

MyApp::MyApp()
      :BApplication("application/x-vnd.big56-MyApp")
{
// メッセージボックスを出す

	BAlert* alert;
	alert = new BAlert("タイトル","Hello World","お約束");
	alert-gt;Go();
}

この中の
BApplication("application/x-vnd.big56-MyApp")
の文字列の意味ですが、

application/x-vnd. これは(データファイルではなく)アプリケーションです、という意味
big56-MyAppbig56が作ったMyAppという名前のアプリケーションという意味

という感じです。
これはシグネチャといって、BeOSがアプリケーションを一意に識別するために必要な情報です。
この書式を間違うと、アプリケーションが終了してしまうので注意してください。
しかも一見強制終了したようにも見えず、何も起こらないので、はまりがちです。

次にメッセージボックスを出すためにBAlertというクラスを利用しています。
このクラスのコンストラクタは次のようになっています。

BAlert(const char *title, 
      const char *text, 
      const char *button0Label, 
      const char *button1Label = NULL, 
      const char *button2Label = NULL, 
      button_width widthStyle = B_WIDTH_AS_USUAL, 
      alert_type type = B_INFO_ALERT

titleには、メッセージボックスのタイトルを指定します。
これは画面には出ることはなく、デバッグの時に便利というだけです。

textには、メッセージボックスに表示させる文字列を指定します。

button0Label〜button2Labelにはボタンの文字列を指定します。
NULLを指定するとボタンそのものが表示されなくなります。
今回は「お約束」というボタンしか使ってないので、文字列は1つしか指定していません。
あとは、引数を指定しないとデフォルトでNULLになります。

widthStyle には、ボタンの幅を指定します。
引数を指定しない(B_WIDTH_AS_USUAL)の場合には、標準の幅が使用されますが、
B_WIDTH_FROM_WIDESTを指定すると、ボタンの文字列に指定したもので、
もっとも長い文字列にあわせて、ボタン幅が決定されます。

typeにはメッセージボックスに表示するアイコンの種類を指定します。
これには次の様な種類があります。

B_EMPTY_ALERT アイコンなし
B_INFO_ALERT INFOアイコン
B_IDEA_ALERT IDEAアイコン
B_WARNING_ALERT WARNINGアイコン
B_STOP_ALERT STOPアイコン

実際にメッセージボックスを表示するのはメンバ関数Go()がやります。
ユーザーがボタンを押すまでこの関数は返ってきません。
返り値には、ボタンの押された番号(左から0番、1番、2番となる)が返ってきます

さてここまで来て鋭い人は、

「あれ、BAlertは解放しなくていいの?」

と思われた人もいるかもしれません。
しかし、BAlertはGo()を呼び出した後にユーザーがボタンを押すと

BeOS側でBAlertのインスタンスを解放してくれるので、
アプリケーション側でわざわざ解放する必要はないのです。

次にReadyToRunというBApplicationのメンバ関数を継承して再定義しています。
この関数はBApplicationオブジェクトの初期化が完了したあとに最初に呼ばれる関数です。
再定義した関数には、分かりやすいようにvirtualを前につけておきました。

void MyApp::ReadyToRun()
{
// アプリケーションを終了する
	Quit();
}

この関数内でやっていることは、アプリケーションを終了することだけです。
実際、この関数を再定義しなくても、メッセージボックスは表示されるのですが、
デスクバー(Windowsでいうところのタスクバー)に、アプリケーションのアイコンが残ったままになってしまいます。
コンストラクタでQuit()を呼び出そうとすると、強制終了になってしまうので、
ReadyToRun()関数内でアプリケーションを終了しています。
(普通はこんな使い方はしないのですが・・・)

最後におなじみのmain関数です。

int main(int argc,char** argv)
{
 	MyApp app;
	app.Run();
	return 0;
}
main関数内では、BApplicationから派生したMyAppのインスタンスを作成して、
Run()というメンバ関数を呼んで終わりです。
多分、以後ほとんどのmain関数ではこのようになるでしょう。

今回は、BApplicationからBeOSプログラムが始まるということを見てきました。
次はウィンドウを出すプログラムに挑戦したいと思います。

[<<前へ] [次へ>>] [戻る]

big56 big56@anet.ne.jp
生命保険の切り替えはココ 海外旅行保険の加入はコチラ! 生命保険の切り替えはココ
[PR] | ヒーリング会社案内 作成se 転職川口栃木荻窪池袋中国SEO対策消費者金融車 買取テンプレート沖縄旅行免許合宿二輪引越しプレゼントゴルフ会員権留学レーシックマッサージFXアフィリエイトFXホームページ制作デイトレードハワイ旅行タイバンコクハワイ レンタカーベスト ハワイ ホテル レーツバリ島Hawaii hotelsHawaii Activitiesbhhrハワイホテルテキスト広告
【運営会社「パラダイムシフト」サービス】 ハワイ現地オプショナルツアーリラックマ) - ビジネスクラス航空券 - 格安航空券(1) - 格安航空券(2) - 海外ホテル - 韓国旅行 - タイムシェア - ホテル 予約
無料ホームページ - 携帯ホームページ - 無料ホームページ作成 - レンタルサーバー - ブログ - ヴィラ - ハワイ コンドミニアム - バリ島 ホテル - プーケット ホテル - 旅行 口コミ - 旅行情報 - 国際電話 - ホノルルマラソン - 掲示板監視 - 風評被害 - ホテル比較 - ノースウェスト航空 - ファイナルチェッカー