今回のソースをまず見てましょう。
今回の重要だと思われる所については強調してあります。
// sample02.cpp
#include <Application.h> // BApplicationを使うために必要
#include <Alert.h> // BAlertを使うために必要
#include <Window.h> // BWindowを使うために必要
#include <Rect.h> // BRectを使うために必要
class MyWindow : public BWindow
{
public:
MyWindow(BRect frame,const char* title,window_type type,uint32 flags);
virtual bool QuitRequested(); // 終了が要求されたときに呼ばれる関数
};
class MyApp : public BApplication
{
public:
MyApp();
private:
MyWindow* m_win;
};
MyWindow::MyWindow(BRect frame,const char* title,window_type type,uint32 flags)
:BWindow(frame,title,type,flags)
{
// カスタマイズする箇所がないので今回はコードなしです
}
bool MyWindow::QuitRequested()
{
// アプリケーションを終了する
be_app-gt;PostMessage(B_QUIT_REQUESTED);
return true;
}
MyApp::MyApp()
:BApplication("application/x-vnd.big56-MyApp")
{
m_win = new MyWindow(BRect(100,100,200,200),"テスト",B_TITLED_WINDOW,0);
m_win->Show();
}
int main(int argc,char** argv)
{
MyApp app;
app.Run();
return 0;
}
今回のプログラムを実行すると次のようなウィンドウが開くはずです
それでは、今回のコードについて解説していきます。
今回プログラム中でBWindowというクラスを継承しています。
class MyWindow : public BWindow
{
public:
MyWindow(BRect frame,const char* title,window_type type,uint32 flags);
};
MyWindow::MyWindow(BRect frame,const char* title,window_type type,uint32 flags)
:BWindow(frame,title,type,flags)
{
// カスタマイズする箇所がないので今回はコードなしです
}
BWindowはコンストラクタに
ウィンドウのフレームサイズを指定するのにBRectというクラスを利用して、
引数をコンストラクタに渡しています。
このBRectは矩形を表すクラスです。
BRectのコンストラクタ仕様は次の様になっています。
BRect(float left,float top,float right,float bottom)
となっています。
BWindowの第3引数と第4引数はウィンドウの種類を決めます。
第3引数(type)には次の定数を指定することができます。
(このときの画像は第4引数に0を指定した場合です)
| B_TITLED_WINDOW | ![]() |
| B_DOCUMENT_WINDOW | ![]() |
| B_MODAL_WINDOW | ![]() |
| B_BORDERED_WINDOW | ![]() |
| B_FLOATING_WINDOW | 同じアプリケーションに属するほかの ウィンドウの上に浮遊するウィンドウ |
第4引数(flags)に指定する定数には次のようなものがあります。
| B_NOT_MOVABLE | ウィンドウを移動することができなくなる。 |
| B_NOT_H_RESIZABLE | 水平方向にリサイズすることができなくなる。 |
| B_NOT_V_RESIZABLE | 垂直方向にリサイズすることができなくなる。 |
| B_NOT_RESIZABLE | リサイズができなくなる。 |
| B_OUTLINE_RISIZE | リサイズするときに枠を描くが内容は更新しない |
| B_NOT_MOVABLE | ウィンドウを閉じるボタンがなくなる。 |
| B_NOT_ZOOMABLE | ズームボタンを取り除く |
| B_NOT_MINIMIZABLE | 最小化することができなくなる。 |
| B_WILL_ACCEPT_FIRST_CLICK | アクティブウィンドウでなくても、マウスボタンメッセージを受け取るようにする |
| B_AVOID_FRONT | 全面にあるウィンドウが閉じられたときにアクティブになることを禁じる |
| B_AVOID_FOCUS | ウィンドウにフォーカスが移ることを禁じる |
| B_NO_WORKSPACE_ACTIVATION | ウィンドウが初めて表示されたときに、通常はワークスペースを切り替えるが ワークスペースを切り替えなくする。 |
| B_NOT_ANCHORED_ON_ACTIVETE | デスクバーによってウィンドウをアクティブにしたときに、 ウィンドウを現在のワークスペースに持ってくる。 通常は、アクティブになったときは、(ウィンドウの位置ではなく) ワークスペースを切り替える |
| B_ASYNCHRONOUS_CONTROLS | コントロールが非同期に動くように指定する。 コントロールを持つウィンドウはこのフラグを含めたほうがよい。 (デフォルトでは過去との互換性のためにオフになっている) |
第4引数に関しては、これらの定数のORを取る( | 演算子でつなぐ)ことにより、
複数の属性を設定できます。
たとえば、B_NOT_RESIZABLE | B_NOT_MOVABLE でリサイズと移動の両方を禁止します。
なにも指定しないときは0を指定すればいいです。
さて、今回のプログラムで実際にウィンドウの種類を決定しているのはMyAppのコンストラクタ内の次のコードです。
MyApp::MyApp()
:BApplication("application/x-vnd.big56-MyApp")
{
m_win = new MyWindow(BRect(100,100,200,200),"テスト",B_TITLED_WINDOW,0);
m_win->Show();
}
ここで注意して欲しいのは、BWindowはインスタンスを作っただけでは、
画面に表示されることはありません。
メンバ関数のShow()をこちら側でちゃんと呼び出して
画面に表示してやる必要があります。
さて、最後に次の部分のコードを見てみましょう。
bool MyWindow::QuitRequested()
{
// アプリケーションを終了する
be_app-gt;PostMessage(B_QUIT_REQUESTED);
return true;
}
前回のBApplicationのReadyToRun()関数が消えたかわりに、この関数が入りました。
ここで使用しているbe_appというのは、アプリケーションに一つだけある、
BApplicationのインスタンスのグローバル変数です。
つまりアプリケーションのコード内ではどこからでも、be_appって名前で
BApplicationのインスタンスにアクセスすることが可能です。
最後にtrueを返していますが、これは「アプリケーションが終了可能だよ」っていうことを
システムに教えているという意味があります。
もっと知りたい人向けに説明すると、QuitRequestedはBWindowの基底クラスのBLooperが持っているメンバ関数です。
前回紹介したBApplicationも、BLooperからの派生クラスなので、QuitRequestedというメンバ関数を持っています。
いかがでしたでしょうか?
前回に比べて長い説明でしたが、追加したコード量は少ないので
そんなに覚えることが多くあるわけではありません。
ウィンドウの種類とかの説明ではすべてを説明しているわけではないので、
今は理解できなくても全然問題ないです。
BWindowではこの他にも、ルック&フィールを指定してウィンドウを指定するやりかたとか、
ウィンドウを作成するワークスペースを指定することができますが、
これはおいおい説明していきたいと思います。
補足 2000/07/28
以前は
bool MyWindow::QuitRequested()
{
// アプリケーションを終了する
be_app-gt;Quit();
return true;
}
としていたのですが、これだとTerminalから実行したときに
「BApplicationオブジェクトをロックしないでQuit()関数を呼ぶな」
といったメッセージが出ていたので、変更しました。
|
|||
|
|