前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

10.4. ウィンドウ

10.4.1. ウィンドウとは

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

表 10.3. ウィンドウの種類

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

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

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

ウィンドウ ( , , )

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

10.4.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.4.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.4.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.4.5. 複数ウィンドウ

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

図 10.22. 複数のウィンドウ

複数のウィンドウ

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

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

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

10.4.6. 無効化

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

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

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

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

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

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

無効になったウィンドウ