Lesson 1:ウインドウを表示してみる


 さて、GUIのアプリケーションを作るなら、一番最初にやらなければならないのは、 当然、ウインドウを作成して表示することでしょう。 そこで、まずはウインドウを表示するだけのアプリケーションを作るとしましょう。
 ただ、ウインドウの作成と表示は、これから先も常に使い続けるものなので、 どうせなら、再利用可能な、今後のアプリケーションの作成のベースとなるように 作ってみましょう。(再利用可能なように整理するのは次回にやります。今回は、その準備までです。)

 まず、プログラムを開発する環境を起動しましょう。
 「Tracker」のメニューから、「Applications」の「BeIDE」を選んで起動します。 すると、テキストエディタが起動します。これが、ソースファイルの編集を行うエディタです。

 BeIDEは、プログラムをプロジェクトで管理しますので、今回のアプリケーション用に、 新しいプロジェクトを作成します。
 プロジェクトの作成は、「File」メニューの「New Project」を選択すると、作成する アプリケーションの種類を選択するウインドウが表示されるので、「x86」の「BeApp」を選択して、 「Create」ボタンを押します。
 プロジェクトの保存場所と名前を任意に決めて保存します。
(今回は「home」の下に「projects」フォルダを作成して、プロジェクト名は「BaseApp.proj」と します。)

 これで、プログラムするための準備が整いました。

 BeOSのアプリケーションは、基本的に、アプリケーションオブジェクト、ウインドウオブジェクト、 ビューオブジェクトを組み合わせて作成します。(他にも色々なオブジェクトがありますが、しばらくは 使用しません。)
アプリケーションオブジェクト:  アプリケーションを制御するオブジェクトで、アプリケーションに一つ絶対に必要です。
 ウインドウオブジェクトの管理等を行います。
 BApplicationクラスを継承して作成します。
ウインドウオブジェクト:  ずばり、ウインドウそのものです。
 ビューオブジェクトを貼り付ける親になります。
ビューオブジェクト:  ウインドウに表示するオブジェクトです。
 ウインドウには、ボタンやテキストコントロール等のビューオブジェクトを貼り付けて表示・操作します。

 あと忘れちゃいけないのが、main関数ですね。BeOSのプログラムもC++言語で記述しているので、 プログラムはmain関数から開始されます。main関数では、アプリケーションオブジェクトの実体を作成、 アプリケーションを実行、アプリケーションオブジェクトの解放を行います。

 まずは最小限必要なものだけで、ウインドウを表示するだけのプログラムを書いてみましょう。
 ファイルはプロジェクトと同じフォルダ(home/projects/BaseApp)に保存します。

/**** ファイル名 : MainWindow.h ****/

#include <Be.h>
//---------------------------------------------------------------------
class BAppMainWindow : public BWindow
{
public:
    BAppMainWindow(BRect frame,const char *title);
    //-----------------------------------------------------------------
    bool QuitRequested()
    {
        be_app->PostMessage(B_QUIT_REQUESTED);
        return true;
    };
};
//---------------------------------------------------------------------
class BaseApp : public BApplication
{
public:
    BaseApp()
        :BApplication("application/x-vnd.vow-baseapp")
    {
        BAppMainWindow *mainwnd=
                        new BAppMainWindow(BRect(100,100,299,219),
                                           "Base Application");
        mainwnd->Show();
    };
};
//---------------------------------------------------------------------


/**** ファイル名 : MainWindow.cpp ****/

#include "MainWindow.h"
//---------------------------------------------------------------------
BAppMainWindow::BAppMainWindow(BRect frame,const char *title)
        :BWindow(frame,title,B_TITLED_WINDOW,0)
{
}
//---------------------------------------------------------------------
int main(void)
{
    new BaseApp();
    be_app->Run();
    delete be_app;
    return true;
}
//---------------------------------------------------------------------

 「Project」メニューの「Add」で「MainWindow.cpp」をプロジェクトに追加します。 (ヘッダファイルを追加する必要はありません。)
 「Project」メニューの「Run」を行うと、プログラムがメークされ、エラーがなければ、 アプリケーションが実行されます。

 タイトルに「Base Application」と書かれたウインドウが表示されれば成功です。
 終了ボタンを押せば、ウインドウは閉じて、アプリケーションも終了します。

 プログラムを少し細かく見てみましょう。


/**** ファイル名 : MainWindow.h ****/

#include <Be.h>
 基本的な設定が含まれている、ヘッダファイル「Be.h」を読み込みます。
class BAppMainWindow : public BWindow
{
public:
    BAppMainWindow(BRect frame,const char *title);
    //-----------------------------------------------------------------
    bool QuitRequested()
    {
        be_app->PostMessage(B_QUIT_REQUESTED);
        return true;
    };
};
 ウインドウオブジェクトのクラス「BWindow」を継承して、BAppMainWindowクラスを作ります。
 BAppMainWindowには、コンストラクタと、QuitRequested関数をオーバーライドします。
 QuitRequested関数は、ウインドウが閉じられる際に処理される関数です。ウインドウが閉じられた際にアプリケーションを終了するように、be_appにB_QUIT_REQUESTEDメッセージをポストしています。

be_app:  main関数で作成したアプリケーションオブジェクトにアクセスすることのできるグローバル変数です。この変数は、起動時に自動的に設定されるため、初期化の必要はありません。
B_QUIT_REQUESTED:  アプリケーションを終了するように要求された際に受信するメッセージです。
 このメッセージをアプリケーションオブジェクトに渡すことで、アプリケーションを終了します。
class BaseApp : public BApplication
{
public:
    BaseApp()
        :BApplication("application/x-vnd.vow-baseapp")
    {
        BAppMainWindow *mainwnd=
                        new BAppMainWindow(BRect(100,100,299,219),
                                           "Base Application");
        mainwnd->Show();
    };
};
 アプリケーションオブジェクトのクラス「BApplication」を継承して、BaseAppクラスを作ります。
 コンストラクタを定義し、その中でウインドウの作成と表示を行っています。

 コンストラクタで「:BApplication("application/x-vnd.vow-baseapp")」と書いてありますが、これは、アプリケーションのMIMEタイプの指定です。「vow-baseapp」としていることには特に意味はなく、アプリケーション毎にユニークな指定になれば大丈夫です。

 BAppMainWindowのコンストラクタの引数は、「BRect frame」となっていて、ここにはウインドウを表示する座標を指定します。
 BRect型の引数に値を設定するには、BRect型の変数を準備しても良いのですが、ここでは、直接コンストラクタで左上と右下の二点のX,Y座標を指定して、値を渡しています。
作成したウインドウは、Show関数で表示します。

/**** ファイル名 : MainWindow.cpp ****/

#include "MainWindow.h"
 MainWindows.hを読み込みます。
BAppMainWindow::BAppMainWindow(BRect frame,const char *title)
        :BWindow(frame,title,B_TITLED_WINDOW,0)
{
}
 BAppMainWindowクラスのコンストラクタを実装します。
 「:BWindow(frame,title,B_TITLED_WINDOW,0)」は継承元のクラスのコンストラクタで、この場合は、frameはウインドウの表示位置、titleはウインドウのタイトルに表示する文字列、B_TITLED_WINDOWはウインドウのスタイル、最後の引数はウインドウの動作(最大化、最小化、移動)の可否等の設定を指定します。
 関数の中身は何も定義していませんが、今後はここで、ビューオブジェクトの作成等を行うことになります。
int main(void)
{
    new BaseApp();
    be_app->Run();
    delete be_app;
    return true;
}
 この関数が、プログラムの開始点になります。
 アプリケーションオブジェクトの実体を作成し、Run関数でアプリケーションを実行します。アプリケーションオブジェクトはbe_appに自動的に割り当てられます。
 Run関数から帰ってくるのは、アプリケーションを終了した時です。
 Run関数が返ってきたら、アプリケーションオブジェクトを解放してプログラムを終了します。


 これで今回の目的である、ウインドウを表示するアプリケーションを作成することができました。
 このウインドウは一つのビューオブジェクトも持っていませんので、たんに白い画面が表示されるだけですが、アプリケーションの起動と終了という、とても大切な仕組みを含んだプログラムです。 次回は、このプログラムを再利用可能なように整理しましょう。
次の項目へ

トップページへ戻る