ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : ウィンドウ

C++ で作成されたBREW アプリで、レスポンダ(GUIフレームワーク)を使ったウィンドウの処理を行う方法です。
SophiaFramework を用いています。

タイトル付きのウィンドウを作成する

SFRTitleWindow クラスを使って、"my window"のタイトルがついたウィンドウを作成します。

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), &qout;my window&qout;) 
{
    // 描画ハンドラを登録する
    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(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));

    return;
}

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

フレーム付きのウィンドウを作成する

SFRFrameWindow クラスを使って、フレーム付きのウィンドウを作成します。

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(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));

    return;
}

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

プレーンウィンドウを作成する

SFRPlainWindow クラスを使って、プレーンウィンドウを作成します。

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(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
    graphics->FillRectangle(GetContentWorld(), 
                            SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));
    return;
}

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

ウィンドウ内を再描画するには

ウィンドウ内を再描画するには、SFRResponder::InvalidateContent 関数を使用します。

SFRWindowPtr window;

// window は再描画したいウィンドウ

window->InvalidateContent();

この関数が呼び出されると、自動的に描画ハンドラが呼び出されます。

SFRResponder::InvalidateContent の引数に、再描画したい領域を指定することもできます。

参照 SFRResponder::InvalidateContent

      

ウィンドウ上に画像を描画するには

ウィンドウ上に画像を描画するには、ウィンドウに描画ハンドラを登録し、
描画ハンドラ内のグラフィック・オブジェクトを使って描画します。

// ウィンドウの定義
class MyWindow : public SFRTitleWindow {
    ...
    MyWindow(Void);

    // 描画ハンドラの宣言
    HANDLER_DECLARE_VOIDRENDER(MyWindow, OnRenderContent)
};

// 描画ハンドラの定義
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // SFBBitmapSmp 型の bitmap に画像が格納されているとする

    // SFXRectangle(0, 0, 100, 100) に画像を描画する
    graphics->BitBlt(SFXRectangle(0, 0, 100, 100), bitmap);

    return;
}

// コンストラクタ
MyWindow::MyWindow(Void) : ...
{
    // ハンドラを登録する(エラー処理は省略)
    RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT,
                        HANDLER_BEFORE, HANDLER_FUNCTION(OnRenderContent));
    return;
}

graphics インスタンスについては グラフィックインターフェースの取得 を参照