![]() ![]() ![]()
|
SophiaFramework 2.1 |
ここではウィンドウを使用した Hello Brew world. のサンプル コードを 示しながらウィンドウの表示の方法を解説します。
サンプル コードでは Hello Brew world. という文字列をウィンドウに 表示して、キーが押されるとウィンドウを閉じる、という動作を行っています。
#include <SophiaFramework.hpp>
SFMTYPEDEFCLASS(HelloWindow)
class HelloWindow : public SFRFrameWindow {
public:
inline HelloWindow(SFRApplicationPtr app) : SFRFrameWindow(app, SFURect(10, 10, 100, 100))
{
RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, Update_static, this);
RegisterHandler(SFEVT_KEY, AVK_SELECT, HANDLER_AFTER, Key_static, this);
return;
}
virtual inline ~HelloWindow(Void)
{
return;
}
static inline Bool Update_static(ConstSFUEventRef event, VoidPtr responder)
{
HelloWindowPtr(responder)->Update_handler(SFUGraphicsPtr(event.P32()));
return(TRUE);
}
inline Void Update_handler(SFUGraphicsPtr graphic)
{
SFRFrameWindow::ContentHandler(graphic);
graphic->SetColor(SFUColor(0x00, 0x00, 0x00));
graphic->DrawString("Hello Brew world.", GetContentWorld());
return;
}
static inline Bool Key_static(ConstSFUEventRef /*event*/, VoidPtr responder)
{
HelloWindowPtr(responder)->Key_handler();
return(TRUE);
}
inline Void Key_handler(Void)
{
Invoke(SFUEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, TRUE));
return;
}
};
SFMTYPEDEFCLASS(WindowHelloBrew)
class WindowHelloBrew : public SFRApplication {
public:
static inline SFCInvokerPtr Constructor(Void)
{
return(new WindowHelloBrew());
}
private:
inline WindowHelloBrew(Void)
{
new HelloWindow(this);
return;
}
virtual inline ~WindowHelloBrew(Void)
{
return;
}
};
SFCInvokerSPP SFCApplet::Boot(AEECLSID id)
{
return((id == AEECLSID_WINDOWHELLOBREW) ? WindowHelloBrew::Constructor : NULL);
}
まず、描画ハンドラである Update_handler ですが、これは 初めに紹介したサンプル コードと全く同じ物です。ただし今回はウィンドウの 中に文字を描画させるので、ハンドラはアプリケーション クラスではなく、 ウィンドウ クラスの中に存在します。
キー ハンドラである Key_handler もウィンドウに登録されており、セレクト キーが 押されるとウィンドウを閉じます。
アプリケーション クラスでは、 ウィンドウを生成するだけになっています。
次にウィンドウ上にボタンを作成してボタンを押すと ウィンドウを閉じるサンプルを示します。
#include <SophiaFramework.hpp>
SFMTYPEDEFCLASS(HelloWindow2)
class HelloWindow2 : public SFRFrameWindow {
public:
inline HelloWindow2(SFRApplicationPtr app) : SFRFrameWindow(app, SFURect(10, 10, 100, 100))
{
SFRControlPtr control;
RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, Update_static, this);
control = new SFRButtonControl(this, SFURect(10, 70, 80, 18), "Close");
control->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE, Control_static, this);
return;
}
virtual inline ~HelloWindow2(Void)
{
return;
}
static inline Bool Update_static(ConstSFUEventRef event, VoidPtr responder)
{
HelloWindow2Ptr(responder)->Update_handler(SFUGraphicsPtr(event.P32()));
return(TRUE);
}
inline Void Update_handler(SFUGraphicsPtr graphic)
{
SFRFrameWindow::ContentHandler(graphic);
graphic->SetColor(SFUColor(0x00, 0x00, 0x00));
graphic->DrawString("Hello Brew world.", GetContentWorld());
return;
}
static inline Bool Control_static(ConstSFUEventRef /*event*/, VoidPtr responder)
{
HelloWindow2Ptr(responder)->Control_handler();
return(TRUE);
}
inline Void Control_handler(Void)
{
Invoke(SFUEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, TRUE));
return;
}
};
SFMTYPEDEFCLASS(WindowHelloBrew2)
class WindowHelloBrew2 : public SFRApplication {
public:
static inline SFCInvokerPtr Constructor(Void)
{
return(new WindowHelloBrew2());
}
private:
inline WindowHelloBrew2(Void)
{
new HelloWindow2(this);
return;
}
virtual inline ~WindowHelloBrew2(Void)
{
return;
}
};
SFCInvokerSPP SFCApplet::Boot(AEECLSID id)
{
return((id == AEECLSID_WINDOWHELLOBREW2) ? WindowHelloBrew2::Constructor : NULL);
}
今回はキー ハンドラを登録するのではなくて、コントロール ハンドラである Control_handler を登録しています。また、ウィンドウを生成するときに ボタン コントロールを一つ生成してウィンドウに貼り付けています。
コントロールのハンドラである Control_handler 内で ウィンドウに対して SREVT_RESPONDER_TERMINATE イベントを送信することによって ウィンドウを破棄しています。
| Copyright(C) 2003 Sophia Cradle Inc., All Rights Reserved. |
![]() ![]() ![]()
|