ホーム > 製品情報 > SophiaFramework UNIVERSE > チュートリアル > BREW Cartoon

BREW Cartoon アプリ 〜 BREW C++ / GUI プログラミング 〜

ウィンドウの生成と破棄

ImageWindow クラス

ウィンドウの種類について

SFMTYPEDEFCLASS(ImageWindow)
class ImageWindow : public SFRPlainWindow
{
private:
    //表示するビットマップ
    SFXBrewPointer<SFBBitmap> m_bitmap;

    //転送先の左上隅の座標
    SFXGrid m_transfered_point;

    //デバイスの画面サイズ
    SFXSize m_devsize;

    //表示するビットマップの拡大する前のサイズ
    SFXSize m_bitmap_size;

    //ビットマップの拡大率
    Float64 m_scale_ratio;

public:
    ...
}

ウィンドウの生成

ウィンドウを生成する部分のコードです。

// Cartoon クラスのキーハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(Cartoon, OnKey, event)
    ...
    new ImageWindow(this, GetContentWorld(), m_bitmap); //ImageWindow を生成
}

ウィンドウの破棄

ウィンドウを破棄する部分のコードです。

ウィンドウをdelete 演算子で破棄することは基本的にできません
(ウィンドウ生成時にコンストラクタ内でエラーが発生した場合は、 delete 演算子で破棄しなければいけません。)

// ImageWindow クラスのキーハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(ImageWindow, OnKey, event)
{
    UInt16 key = event.GetP16();
    switch (key) {
    case AVK_SELECT:   // セレクトキー
    case AVK_CLR:      // クリアーキー
        // ウィンドウの破棄
        Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
        return true;
    }
    return false;
}

描画ハンドラ

描画ハンドラでは拡大画像を表示します。

// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(ImageWindow, OnDraw, graphic)
{
    SFBShellSmp        shell = SFBShell::GetInstance();
    SFBBitmapSmp       pSourceBitmap;
    SFBTransformSmp    pTransform;
    AEETransformMatrix           matrix;

    //ウィンドウ全体を白で塗りつぶす
    graphic->DrawRectangle(GetContentWorld(), SFXRGBColor(255, 255, 255, 255));

    //変形用行列
    matrix.A = static_cast<SIntN>(m_scale_ratio * 256.0);
    matrix.B = 0;
    matrix.C = 0;
    matrix.D = static_cast<SIntN>(m_scale_ratio * 256.0);

    //ビットマップを拡大して表示する
    pSourceBitmap = graphic->CreateBitmap(m_bitmap_size);
    pSourceBitmap->BltIn(SFXRectangle(0, 0, m_bitmap_size), m_bitmap, SFXGrid(0, 0));

    pTransform = SFBTransform::NewInstance(graphic->GetDestination());
    pTransform->TransformBltComplex(
        SFXGrid(m_transfered_point.GetX(), m_transfered_point.GetY()), 
        pSourceBitmap, SFXRectangle(0, 0, m_bitmap_size), matrix);
}

コンストラクタ

// コンストラクタ
ImageWindow::ImageWindow(SFRApplicationPtr papp, SFXRectangleConstRef rect,
    SFBBitmapSmpConstRef bmp) : SFRPlainWindow(papp, rect)
{
    //イベントハンドラの登録
    RegisterHandler(
        SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE,
        HANDLER_FUNCTION(OnDraw));
    RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey));

    //表示するビットマップの初期化
    m_bitmap = bmp;

    //表示するビットマップの拡大率を決める
    Float64 bmp_aspect_ratio;
    Float64 dev_aspect_ratio;
    AEEDeviceInfo devinfo;
    AEEBitmapInfo bmpinfo;
    SFBShellSmp shell = SFBShell::GetInstance(); 
 
    m_bitmap->GetInfo(&bmpinfo);
    m_bitmap_size.SetWidth(static_cast<SInt16>(bmpinfo.cx));
    m_bitmap_size.SetHeight(static_cast<SInt16>(bmpinfo.cy));

    shell->GetDeviceInfo(&devinfo);
    m_devsize.SetWidth(devinfo.cxScreen);
    m_devsize.SetHeight(devinfo.cyScreen);

    bmp_aspect_ratio = static_cast<Float64>(m_bitmap_size.GetWidth()) /
        static_cast<Float64>(m_bitmap_size.GetHeight()); 
    dev_aspect_ratio = static_cast<Float64>(m_devsize.GetWidth()) /
        static_cast<Float64>(m_devsize.GetHeight());

    Bool isheight_fit;
    if (dev_aspect_ratio >= bmp_aspect_ratio) {
        m_scale_ratio = static_cast<Float64>(
            m_devsize.GetHeight() / m_bitmap_size.GetHeight());
        isheight_fit = TRUE;
    }
    else {
        m_scale_ratio = static_cast<Float64>(
            m_devsize.GetWidth()) / static_cast<Float64>(m_bitmap_size.GetWidth());
        isheight_fit = FALSE;
    }

    //転送先の座標を指定する
    m_transfered_point.SetX(static_cast<SInt16>(
        m_bitmap_size.GetWidth() * (m_scale_ratio - 1.0) / 2.0));
    m_transfered_point.SetY(static_cast<SInt16>(
        m_bitmap_size.GetHeight() * (m_scale_ratio - 1.0) / 2.0));
    if (isheight_fit) {
        m_transfered_point.AddX(static_cast<SInt16>(
            (m_devsize.GetWidth() - m_bitmap_size.GetWidth() * m_scale_ratio) / 2.0));
    }
    else {
        m_transfered_point.AddY(static_cast<SInt16>(
            (m_devsize.GetHeight() - m_bitmap_size.GetHeight() * m_scale_ratio) / 2.0)); 
    }
}

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

補足:ウィンドウの種類

SophiaFramework UNIVERSE に用意されているウィンドウクラスは3種類あります。

SFRPlainWindow  SFRFrameWindow  SFRTitleWindow

アプリでウィンドウを使用する場合はこれらのうちいずれかのウィンドウを継承して使用します。