Lesson 2:ベースになるアプリケーションを作成する


 前回、ウインドウを表示することができましたので、今回は、そのプログラムを整理して、 再利用可能なベースとなるプログラムにしましょう。
 その前に、前回使用しなかった、ビューオブジェクトを使用してみます。

 前回作成した「BaseApp.proj」を開きましょう。「MainWindow.cpp」の中で BAppMainWindowクラスのコンストラクタを記述していますので、次のように書き換えましょう。

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

BAppMainWindow::BAppMainWindow(BRect frame,const char *title)
        :BWindow(frame,title,B_TITLED_WINDOW,0)
{
    BView *view=new BView(BRect(30,30,60,60),"view1",
                      B_FOLLOW_LEFT | B_FOLLOW_TOP,NULL); 
    AddChild(view); 
}

 これを実行すると、以前と同じ何もないウインドウが表示されます。ところが、 実際には白いビューウインドウが表示されているのです。
 これではわかりにくいので、ビューウインドウに色をつけてみましょう。
 BAppMainWindowクラスのコンストラクタに「view->SetViewColor(0,0xff,0xff);」 を追加して実行してみましょう。
 ウインドウの中に、水色の四角が表示されたはずです。この四角がビューオブジェクトです。

 このビューオブジェクトをウインドウの大きさいっぱいいっぱいに表示するには、 BViewのコンストラクタに渡している「BRect(30,30,60,60)」を、「Bounds()」 と記述すればOKです。
 Bounds関数はウインドウ枠の内側の座標をBRect型で返します。
 この状態で実行して、ウインドウの大きさを変更してみましょう。ビューウインドウは 同じ大きさのまま左上から移動しないはずです。

 ビューの位置や大きさの制御は、BViewのコンストラクタの三つ目の引数で設定します。
 試しにBViewコンストラクタに「B_FOLLOW_ALL」と三つ目の引数を記述して実行し、 ウインドウの大きさを変更してみて下さい。
 今度はどんなに大きさを変えても、ビューオブジェクトがウインドウ全体に表示されていますよね。

 これ以外にも、「B_FOLLOW_LEFT」「B_FOLLOW_RIGHT」「B_FOLLOW_TOP」 「B_FOLLOW_BOTTOM」「B_FOLLOW_H_CENTER」「B_FOLLOW_V_CENTER」等々の指定が あり、Orで複数を組み合わせて指定できますので、色々書き換えて、実際に動作させてみて下さい。
 BViewのコンストラクタの四つ目の引数は、BViewが受け取る通知に付いての設定ですが、特に指定するものが無い場合は、0としておきます。
 では、いよいよプログラムを再利用しやすいように、整理してみましょう。
まずは、構成する要素を考えます。  これではビューオブジェクトがありませんので、BAppMainWindowの中に、ボタンやテキストコントロール等の親となるビューオブジェクトを 「BAppMainView」という名前で定義し、貼り付けましょう。
 この中で、関係の強いものは「BAppMainWindow」と「BAppMainView」ですから、 これをひとまとめにして、ファイルの構成を考えて、次の四つのファイルに分割してみましょう。
MainWindow.h:  BAppMainWindowクラスとBAppMainViewクラスを定義します。
MainWindow.cpp:  BAppMainWindowクラスとBAppMainViewクラスのメンバ関数を定義します。
BaseApp.h:  BaseAppクラスを定義します。
main.cpp:  main関数を定義します。
 また、ウインドウの表示位置や大きさ、タイトル、アプリケーションのMIMEタイプ等も設定しやすいように #defineで定義するようにします。

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

#ifndef MAINWINDOW
#define MAINWINDOW
//---------------------------------------------------------------------
#include <Be.h>
//---------------------------------------------------------------------
#define MAINWINDOW_TITLE            "Base Application"
#define MAINWINDOW_POSITION_LEFT    100
#define MAINWINDOW_POSITION_TOP     100
#define MAINWINDOW_POSITION_WIDTH   400
#define MAINWINDOW_POSITION_HEIGHT  320
#define MAINWINDOW_WINDOWSTYLE      (B_TITLED_WINDOW)
//---------------------------------------------------------------------
class BAppMainView : public BView
{
public:
    BAppMainView(BRect frame);
};
//---------------------------------------------------------------------
class BAppMainWindow : public BWindow
{
public:
    BAppMainView *mainview;
    //-----------------------------------------------------------------
    BAppMainWindow(BRect frame,const char *title);
    virtual void MessageReceived(BMessage *msg);
    //-----------------------------------------------------------------
    bool QuitRequested()
    {
        be_app->PostMessage(B_QUIT_REQUESTED);
        return true;
    };
};
//---------------------------------------------------------------------
#endif

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

//---------------------------------------------------------------------
#include "MainWindow.h"
//---------------------------------------------------------------------
BAppMainWindow::BAppMainWindow(BRect frame,const char *title)
    :BWindow(frame,title,MAINWINDOW_WINDOWSTYLE,0)
{
    mainview=new BAppMainView(Bounds());    
    AddChild(mainview);
}
//---------------------------------------------------------------------
void BAppMainWindow::MessageReceived(BMessage *msg)
{
    switch(msg->what)
    {
        default:
            BWindow::MessageReceived(msg);
    }
}
//---------------------------------------------------------------------
BAppMainView::BAppMainView(BRect frame)
    :BView(frame,"bappmainview",B_FOLLOW_ALL,B_WILL_DRAW)
{
    //Insert Code
}
//---------------------------------------------------------------------

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

#ifndef BASEAPP
#define BASEAPP
//---------------------------------------------------------------------
#include <Be.h>
#include "MainWindow.h"
//---------------------------------------------------------------------
#define APPLICATION_SIGNATURE "application/x-vnd.vow-baseapp"
//---------------------------------------------------------------------
class BaseApp : public BApplication
{
public:
    BaseApp()
        :BApplication(APPLICATION_SIGNATURE)
    {
        BAppMainWindow *mainwnd=new BAppMainWindow(
            BRect(MAINWINDOW_POSITION_LEFT,MAINWINDOW_POSITION_TOP,
                  MAINWINDOW_POSITION_WIDTH+MAINWINDOW_POSITION_LEFT-1,
                  MAINWINDOW_POSITION_HEIGHT+MAINWINDOW_POSITION_TOP-1),
            MAINWINDOW_TITLE);
        mainwnd->Show();
    };
};
//---------------------------------------------------------------------
#endif

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

//---------------------------------------------------------------------
#include "BaseApp.h"
//---------------------------------------------------------------------
int main(void)
{
    new BaseApp();
    be_app->Run();
    delete be_app;
    return true;
}
//---------------------------------------------------------------------

 「main.cpp」をプロジェクトに追加して、実行してみましょう。 前回よりも大きなウインドウが表示されるはずです。

 BAppMainWindowクラスで、MessageReceived関数を定義していますが、 これについての説明は次回にまわします。

 今後のアプリケーション作成で、このプロジェクトをコピーして使用しても 良いのですが、BeIDEにはプロジェクトの雛型を登録しておくことができるので、 BaseApp.projも雛型として登録しておきましょう。

 「/boot/develop/BeIDE/stationery/x86」に「BaseApp」フォルダを作成して、 そこに次のファイルをコピーします。
 これで、次回から新規プロジェクトを作成する際にアプリケーションの種類の選択で 「BaseApp」を選択することができるようになります。

 今回はここまで。次回からは、色々なビューオブジェクトを使うプログラムを作ってみましょう。
ソースリスト
圧縮ファイル
R5 Intel環境で確認
BaseApp19991122.zip
ソースファイル
BaseApp.h
main.cpp
MainWindow.cpp
MainWindow.h

次の項目へ

トップページへ戻る