前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1

10.3. ウィンドウ

10.3.1. ウィンドウとは

SFRWindow を継承するウィンドウは 3 種類あります。

表 10.3. ウィンドウの種類

クラス名 解説
SFRPlainWindow タイトルやフレームのないプレーンなウィンドウを表すレスポンダです。
SFRFrameWindow フレーム付きのウィンドウを表すレスポンダです。
SFRTitleWindow タイトル付きのウィンドウを表すレスポンダです。

通常、ウィンドウはいずれかのウィンドウを継承して使います。

図 10.11. ウィンドウ ( SFRPlainWindow, SFRFrameWindow, SFRTitleWindow )

ウィンドウ ( , , )

関連情報: GUI フレームワークを使う開発 : ウィンドウ

10.3.2. プレーン ウィンドウ

図 10.12. プレーン ウィンドウ

プレーン ウィンドウ

SFRPlainWindow を継承する MyWindow クラスのインスタンス(プレーン ウィンドウ)を作成します。

例 10.11. プレーン ウィンドウの定義・実装・作成 1

// 座標 : ( 20, 20 ) 、幅 : 200、高さ : 250 のプレーン ウィンドウ
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRPlainWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void);
    virtual ~MyWindow(Void);
};

// コンストラクタ
// SFRPlainWindow の第 1 引数 : アプリ クラスのポインター、第 2 引数 : ウィンドウの位置と大きさ
MyWindow::MyWindow(Void) : SFRPlainWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250))
{
    return;
}

// プレーン ウィンドウの作成
MyWindowPtr window;
window = new MyWindow();

図 10.13. 実行結果

実行結果
[Note] 注意

タイトルやフレームのないプレーンなウィンドウのため、見た目には作成されていないように見えます。

SFRPlainWindow を継承する MyWindow クラスのインスタンス(プレーン ウィンドウ)に、 SFXGraphics インスタンスを使って "Hello Window" を描画します。

例 10.12. プレーン ウィンドウの定義・実装・作成 2

						
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRPlainWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
    
    // 描画ハンドラの宣言
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};

// コンストラクタ
MyWindow::MyWindow(Void) : SFRPlainWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250)) 
{
    // ハンドラの登録
    RegisterHandler(SREVT_RESPONDER_RENDER, 
                    SRP16_RENDER_CONTENT,
                    HANDLER_BEFORE, 
                    HANDLER_FUNCTION(OnRenderContent));
    return;
}

// ウィンドウ内に描画する描画ハンドラの定義
// 第 1 引数 : 所属クラス、第 2 引数 : ハンドラ名、第 3 引数 : SFXGraphics インスタンス
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // SFXGraphics インスタンスによる描画
 
    // ウィンドウの中を水色に設定
    // GetContentWorld() はウィンドウの中の描画領域を表す長方形 ( SFXRectangle ) を返す
    // SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00) : 水色
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00));

    // "Hello Window" 文字列表示
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

// プレーン ウィンドウの作成
MyWindowPtr window;
window = new MyWindow();

図 10.14. 実行結果

実行結果

10.3.3. フレーム ウィンドウ

図 10.15. フレーム ウィンドウ

フレーム ウィンドウ

SFRFrameWindow を継承する MyWindow クラスのインスタンス(フレーム ウィンドウ)を作成します。

例 10.13. フレーム ウィンドウの定義・実装・作成 1

// 座標 : ( 20, 20 ) 、幅 : 200、高さ : 250 のフレーム ウィンドウ
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRFrameWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void);
    virtual ~MyWindow(Void);
};

// コンストラクタ
// SFRFrameWindow の第 1 引数 : アプリ クラスのポインター、第 2 引数 : ウィンドウの位置と大きさ
MyWindow::MyWindow(Void) : SFRFrameWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250))
{
    return;
}

// フレーム ウィンドウの作成
MyWindowPtr window;
window = new MyWindow();

図 10.16. 実行結果

実行結果

SFRFrameWindow を継承する MyWindow クラスのインスタンス(フレーム ウィンドウ)に、 SFXGraphics インスタンスを使って "Hello Window" 描画します。

例 10.14. フレーム ウィンドウの定義・実装・作成 2

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRFrameWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
    
    // 描画ハンドラの宣言
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};

// コンストラクタ
MyWindow::MyWindow(Void) : SFRFrameWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250)) 
{
    // ハンドラの登録
    RegisterHandler(SREVT_RESPONDER_RENDER, 
                    SRP16_RENDER_CONTENT,
                    HANDLER_BEFORE, 
                    HANDLER_FUNCTION(OnRenderContent));
    return;
}

// ウィンドウ内に描画する描画ハンドラの定義
// 第 1 引数 : 所属クラス、第 2 引数 : ハンドラ名、第 3 引数 : SFXGraphics インスタンス
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // SFXGraphics インスタンスによる描画
 
    // ウィンドウの中を水色に設定
    // GetContentWorld() はウィンドウの中の描画領域を表す長方形 ( SFXRectangle ) を返す
    // SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00) : 水色
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00));

    // "Hello Window" 文字列表示
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

// フレーム ウィンドウの作成
MyWindowPtr window;
window = new MyWindow();

図 10.17. 実行結果

実行結果

10.3.4. タイトル ウィンドウ

SFRTitleWindow を継承する MyWindow クラスを作成します。

図 10.18. タイトル ウィンドウ

タイトル ウィンドウ

SFRTitleWindow を継承する MyWindow クラスのインスタンス(タイトル ウィンドウ)を作成します。

例 10.15. タイトル ウィンドウの定義・実装・作成 1

// 座標 : ( 20, 20 ) 、幅 : 200、高さ : 250、タイトル : "my window" のタイトル ウィンドウ
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void);
    virtual ~MyWindow(Void);
};

// コンストラクタ
// SFRTitleWindow の第 1 引数 : アプリ クラスのポインター、第 2 引数 : ウィンドウの位置と大きさ、第 3 引数 : ウィンドウのタイトル
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window")
{
    return;
}

// タイトル ウィンドウの作成
MyWindowPtr window;
window = new MyWindow();

図 10.19. 実行結果

実行結果

SFRTitleWindow を継承する MyWindow クラスのインスタンス(タイトル ウィンドウ)に、 SFXGraphics インスタンスを使って "Hello Window" 描画します。

例 10.16. タイトル ウィンドウの定義・実装・作成 2

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
    
    // 描画ハンドラの宣言
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};

// コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") 
{
    // ハンドラの登録
    RegisterHandler(SREVT_RESPONDER_RENDER, 
                    SRP16_RENDER_CONTENT,
                    HANDLER_BEFORE, 
                    HANDLER_FUNCTION(OnRenderContent));
    return;
}

// ウィンドウ内に描画する描画ハンドラの定義
// 第 1 引数 : 所属クラス、第 2 引数 : ハンドラ名、第 3 引数 : SFXGraphics インスタンス
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // SFXGraphics インスタンスによる描画
 
    // ウィンドウの中を水色に設定
    // GetContentWorld() はウィンドウの中の描画領域を表す長方形 ( SFXRectangle ) を返す
    // SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00) : 水色
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xCE, 0xFF, 0xFF, 0x00));

    // "Hello Window" 文字列表示
    // SFXRGBColor(0x00, 0x00, 0x00, 0x00) : 黒色
    graphics->DrawText("Hello Window", 
                       GetContentWorld(),
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

// タイトル ウィンドウの作成
MyWindowPtr window;
window = new MyWindow();

図 10.20. 実行結果

実行結果

GetContentWorld 関数で取得できる 描画領域 は、左上端が ( 0 , 0 ) となります。

図 10.21. タイトル ウィンドウの描画領域

タイトル ウィンドウの描画領域

10.3.5. 複数ウィンドウ

ウィンドウはいくつでも作成できます。ウィンドウが複数存在する場合、イベント処理はイベントの種類によって異なります。例えば、キー イベントは最前面のウィンドウ( のフォーカスの当たったコントロール )に送信されます。サスペンド、レジューム イベントはすべてのウィンドウに送信されます。

図 10.22. 複数のウィンドウ

複数のウィンドウ

ウィンドウを最前面にするには、Select 関数を使います。

例 10.17. ウィンドウを最前面にする方法

// _window は SFRWindowPtr 型
_window->Select();

10.3.6. 無効化

ウィンドウは、選択できないように無効にしたり、非表示にできます。ウィンドウを無効にすると、そのウィンドウ内のすべてのコントロールも無効になります。

表 10.4. レスポンダの有効/無効、表示/非表示に関する関数

関数名 解説
SetStatusEnable レスポンダの応答可能 / 不可能フラグを設定します。( 引数 true : 有効 、false : 無効 )
GetStatusEnable レスポンダの応答可能 / 不可能フラグを取得します。
SetStatusVisible レスポンダの可視 / 不可視フラグを設定します。( 引数 true : 表示 、false : 非表示 )
GetStatusVisible レスポンダの可視 / 不可視フラグを取得します。

ウィンドウを無効にする方法

// _window は SFRWindowPtr 型
_window->SetStatusEnable(false);

図 10.23. 無効になったウィンドウ

無効になったウィンドウ