さて今回から実際に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プログラムは、
というのが定石です。
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-MyApp | big56が作った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 | |
| B_IDEA_ALERT | |
| B_WARNING_ALERT | |
| B_STOP_ALERT | |
実際にメッセージボックスを表示するのはメンバ関数Go()がやります。
ユーザーがボタンを押すまでこの関数は返ってきません。
返り値には、ボタンの押された番号(左から0番、1番、2番となる)が返ってきます
さてここまで来て鋭い人は、
「あれ、BAlertは解放しなくていいの?」
と思われた人もいるかもしれません。
しかし、BAlertはGo()を呼び出した後にユーザーがボタンを押すと
次に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のインスタンスを作成して、
今回は、BApplicationからBeOSプログラムが始まるということを見てきました。
次はウィンドウを出すプログラムに挑戦したいと思います。