第3回 ウィンドウを表示する


さて今回はウィンドウの表示に挑戦してみます。
そのために新しいクラスであるBWindowとBRectが今回登場します。
しかし、そんなに難しくないので肩肘張らずに読み進めてください。

今回のソースをまず見てましょう。
今回の重要だと思われる所については強調してあります。

// 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_WINDOWB_TITLED_WINDOWの画像
B_DOCUMENT_WINDOWB_DOCUMENT_WINDOWの画像
B_MODAL_WINDOWB_MODAL_WINDOWの画像
B_BORDERED_WINDOWB_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()関数を呼ぶな」
といったメッセージが出ていたので、変更しました。

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

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