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

9.4. ウィンドウ

ウィンドウの内部に "Hello World" を描画し、セレクト キーが押されるとウィンドウを閉じる OnlyWindow アプリを以下に示します。

図 9.2. OnlyWindow アプリ

OnlyWindow アプリ

例 9.10. OnlyWindow アプリ : .hpp ファイル ( クラスの定義 )

//
//      OnlyWindow.hpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.0.
//

#ifndef __ONLYWINDOW_HPP
#define __ONLYWINDOW_HPP

#include <SophiaFramework.hpp>
#include "OnlyWindow.bid"

SFMTYPEDEFCLASS(OnlyWindow)
class OnlyWindow : public SFRApplication {
    SFMSEALCOPY(OnlyWindow)
public:
    static SFCInvokerPtr Factory(Void);
private:
    OnlyWindow(Void) static_throws;
    virtual ~OnlyWindow(Void);
};

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_BOOLEVENT(OnKey)
};

#endif // __ONLYWINDOW_HPP //

例 9.11. OnlyWindow アプリ : .cpp ファイル ( ブート ローダとファクトリ関数の実装、ハンドラの実装と登録 )

//
//      OnlyWindow.cpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.0.
//

#include "OnlyWindow.hpp"

// ブート ローダ
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    *license = "heap://";

    return (id == AEECLSID_ONLYWINDOW) ? (&OnlyWindow::Factory) : (null);
}

// ファクトリ関数
SFCInvokerPtr OnlyWindow::Factory(Void)
{
    return ::new OnlyWindow;
}

// コンストラクタ
OnlyWindow::OnlyWindow(Void) static_throws
{
    SFRWindowPtr window;

    if (static_try()) {
        if ((window = ::new MyWindow()) != null) {
            static_throw(*window);
            if (!static_try()) {
                ::delete window;
            }
        }
        else {
            static_throw(SFERR_NO_MEMORY);
        }
    }
    return;
}

// デストラクタ
OnlyWindow::~OnlyWindow(Void)
{
    return;
}

// コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(), SFXGraphics::GetDeviceRectangle().Deflate(20, 20), "my window") static_throws
{
    if (static_try()) {
        static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, 
                                     SRP16_RENDER_CONTENT, 
                                     HANDLER_BEFORE, 
                                     HANDLER_FUNCTION(OnRenderContent)));
    }
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_KEY, 
                                     HANDLER_AFTER, 
                                     HANDLER_FUNCTION(OnKey)));
    }
    return;
}

// デストラクタ
MyWindow::~MyWindow(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // 画面に文字列 "Hello World"を描画する
    graphics->DrawText("Hello World", 
                       GetContentWorld(), 
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

// キーハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(MyWindow, OnKey, event)
{
    // キーイベントの処理
    switch (event.GetP16()) {
        case AVK_SELECT:// セレクトキーが押されたとき
            // ウィンドウを閉じる
            return Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, 
                                   SRP16_TERMINATE_INVOKE, 
                                   true));
    }
    return false;
}

上記コードでは、 タイトル ウィンドウ SFRTitleWindow を継承する、MyWindow クラスを定義しています。 "Hello World" 文字列の描画とセレクトキーの処理についてのハンドラを宣言、登録、実装しています。

OnlyWindow アプリ クラスのコンストラクタでは、MyWindow クラスのインスタンスを生成します。

MyWindow クラスのコンストラクタでは、ハンドラを登録します。 MyWindow クラスのキー ハンドラでは、セレクト キーが押された時に自分自身であるウィンドウを破棄するために、SREVT_RESPONDER_TERMINATE イベントを送信します。

ウィンドウ上に文字列 "Hello World" とボタンを表示し、ボタンが押されると、ウィンドウを閉じる ButtonWindow アプリを以下に示します。

図 9.3. ButtonWindowアプリ

ButtonWindowアプリ

例 9.12. ButtonWindowアプリ : .hpp ファイル ( クラスの定義 )

//
//      ButtonWindow.hpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.0.
//

#ifndef __BUTTONWINDOW_HPP
#define __BUTTONWINDOW_HPP

#include <SophiaFramework.hpp>
#include "ButtonWindow.bid"

SFMTYPEDEFCLASS(ButtonWindow)
class ButtonWindow : public SFRApplication {
    SFMSEALCOPY(ButtonWindow)
public:
    static SFCInvokerPtr Factory(Void);
private:
    ButtonWindow(Void) static_throws;
    virtual ~ButtonWindow(Void);
};

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void);
private:
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
    HANDLER_DECLARE_VOIDVOID(OnButtonControl)
};

#endif // __BUTTONWINDOW_HPP //

例 9.13. ButtonWindowアプリ : .cpp ファイル ( ブート ローダとファクトリ関数の実装、ハンドラの実装と登録 )

//
//      ButtonWindow.cpp
//
//      This source code was automatically
//      generated by SophiaFramework UNIVERSE 5.0.
//

#include "ButtonWindow.hpp"

// ブート ローダ
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    *license = "heap://";

    return (id == AEECLSID_BUTTONWINDOW) ? (&ButtonWindow::Factory) : (null);
}

// ファクトリ関数
SFCInvokerPtr ButtonWindow::Factory(Void)
{
    return ::new ButtonWindow;
}

// コンストラクタ
ButtonWindow::ButtonWindow(Void) static_throws
{
    SFRWindowPtr window;

    if (static_try()) {
        if ((window = ::new MyWindow()) != null) {
            static_throw(*window);
            if (!static_try()) {
                ::delete window;
            }
        }
        else {
            static_throw(SFERR_NO_MEMORY);
        }
    }
    return;
}

// デストラクタ
ButtonWindow::~ButtonWindow(Void)
{
    return;
}

// コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(), SFXGraphics::GetDeviceRectangle().Deflate(20, 20), "my window") static_throws
{
    SFRButtonControlPtr control;
    SFXRectangle rect;

    if (static_try()) {
        static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, 
                                     SRP16_RENDER_CONTENT, 
                                     HANDLER_BEFORE, 
                                     HANDLER_FUNCTION(OnRenderContent)));
    }
    
     // ボタン コントロールの座標を計算する
     rect = GetContentWorld();
     rect.AddTop(rect.GetHeight() - 28);
     rect.Deflate(2, 2);
					
     // ボタン コントロールを生成してハンドラを登録する
     control = ::new SFRButtonControl(this, rect, "Close");
					
     if (static_try()) {
         static_throw(control->RegisterHandler(SREVT_CONTROL, 
                                               HANDLER_BEFORE, 
                                               HANDLER_FUNCTION(OnButtonControl)));
     }

    return;
}

// デストラクタ
MyWindow::~MyWindow(Void)
{
    return;
}

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyWindow, OnRenderContent, graphics)
{
    // 親クラスのデフォルト ハンドラを呼び出す
    SFRTitleWindow::ContentHandler(graphics);

    // 文字列 "Hello World" を画面に描画する
    graphics->DrawText("Hello World", 
                       GetContentWorld(), 
                       SFXRGBColor(0x00, 0x00, 0x00, 0x00));
    return;
}

// ボタン コントロール ハンドラ
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl, result, control){
    // ボタン コントロールが押されたら、ウィンドウを閉じる
    Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, 
                    SRP16_TERMINATE_INVOKE, 
                    true));
    return;
}

このサンプルコードでは、MyWindow クラスのコンストラクタではボタンを作成し、ボタンにハンドラを登録しています。ボタンのハンドラでウィンドウを破棄します。