SophiaFramework UNIVERSE 5.3 |
ここでは、SophiaFramework UNIVERSE のアプリケーションウィザードが自動生成する、 サスペンド や レジュームなどの処理を含む HelloWorld アプリのコードについて解説します。
SophiaFramework UNIVERSE のアプリケーションウィザードが自動生成する、 HelloWorld アプリのアプリケーションクラスの最大コードです。
例 9.42. 宣言
// // USRApplication.hpp // // This source code was automatically // generated by SophiaFramework UNIVERSE 5.3. // #ifndef __USRAPPLICATION_HPP #define __USRAPPLICATION_HPP #define TARGET_BUILD_DEBUG #include <SophiaFramework.hpp> #include "USRApplication.bid" SFMTYPEDEFCLASS(USRApplication) class USRApplication: public SFYApplication { SFMSEALCOPY(USRApplication) public: static SFCInvokerPtr Factory(Void); private: explicit USRApplication(Void) static_throws; virtual ~USRApplication(Void); XANDLER_DECLARE_VOIDRENDER(OnRenderRequest) XANDLER_DECLARE_VOIDSTART(OnAppStart) XANDLER_DECLARE_VOIDSTOP(OnAppStop) XANDLER_DECLARE_VOIDRESUME(OnAppResume) XANDLER_DECLARE_VOIDSUSPEND(OnAppSuspend) XANDLER_DECLARE_BOOLVOID(OnAppNoClose) XANDLER_DECLARE_BOOLVOID(OnAppNoSleep) XANDLER_DECLARE_BOOLEVENT(OnKey) XANDLER_DECLARE_BOOLEVENT(OnKeyPress) XANDLER_DECLARE_BOOLEVENT(OnKeyRelease) }; #endif // __USRAPPLICATION_HPP //
例 9.43. 実装
// // USRApplication.cpp // // This source code was automatically // generated by SophiaFramework UNIVERSE 5.3. // #include "USRApplication.hpp" // ブートローダ SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license) { // ここにライセンスコードを記述する *license = "heap://"; return (id == AEECLSID_USRAPPLICATION) ? (&USRApplication::Factory): (null); } // ファクトリ関数: ユーザー定義アプリケーションクラスのインスタンスを生成する関数 SFCInvokerPtr USRApplication::Factory(Void) { return ::new USRApplication; } // コンストラクタ USRApplication::USRApplication(Void) static_throws { // ここに各種ハンドラの登録を記述する if (static_try()) { // 描画ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_RESPONDER_RENDER, SFEVT_RESPONDER_RENDER, SFP16_RENDER_REQUEST, SFP16_RENDER_REQUEST), XANDLER_INTERNAL(OnRenderRequest) )); } if (static_try()) { // アプリ開始ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_APP_START, SFEVT_APP_START, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnAppStart) )); } if (static_try()) { // アプリ終了ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_APP_STOP, SFEVT_APP_STOP, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnAppStop) )); } if (static_try()) { // アプリ再開ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_APP_RESUME, SFEVT_APP_RESUME, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnAppResume) )); } if (static_try()) { // アプリ中断ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_APP_SUSPEND, SFEVT_APP_SUSPEND, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnAppSuspend) )); } if (static_try()) { // アプリ終了確認ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_APP_NO_CLOSE, SFEVT_APP_NO_CLOSE, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnAppNoClose) )); } if (static_try()) { // アプリスリープ確認ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_APP_NO_SLEEP, SFEVT_APP_NO_SLEEP, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnAppNoSleep) )); } if (static_try()) { // キーハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_KEY, SFEVT_KEY, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnKey) )); } if (static_try()) { // キー押下ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_KEY_PRESS, SFEVT_KEY_PRESS, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnKeyPress) )); } if (static_try()) { // キー解放ハンドラの登録 static_throw(RegisterHandler( SFXEventRange(SFEVT_KEY_RELEASE, SFEVT_KEY_RELEASE, SFP16_BEGIN, SFP16_END), XANDLER_INTERNAL(OnKeyRelease) )); } } // デストラクタ USRApplication::~USRApplication(Void) { } // 描画ハンドラ XANDLER_IMPLEMENT_VOIDRENDER(USRApplication, OnRenderRequest, invoker, reason, graphics) { // 未使用変数のワーニングを回避する unused(invoker); unused(reason); // ここに描画時の処理を記述する // 画面の中央に "Hello World" という文字列を黒色で描画する graphics->DrawSingleText("Hello World", GetLocalBound(), SFXRGBColor(0x00, 0x00, 0x00, 0x00)); return; } // アプリ開始ハンドラ XANDLER_IMPLEMENT_VOIDSTART(USRApplication, OnAppStart, invoker, environment) { // 未使用変数のワーニングを回避する unused(invoker); unused(environment); // ここにアプリ開始時の処理を記述する return; } // アプリ終了ハンドラ XANDLER_IMPLEMENT_VOIDSTOP(USRApplication, OnAppStop, invoker, quitable) { // 未使用変数のワーニングを回避する unused(invoker); unused(quitable); // ここにアプリ終了時の処理を記述する return; } // アプリ再開ハンドラ XANDLER_IMPLEMENT_VOIDRESUME(USRApplication, OnAppResume, invoker, environment) { // 未使用変数のワーニングを回避する unused(invoker); unused(environment); // ここにアプリ再開時の処理を記述する return; } // アプリ中断ハンドラ XANDLER_IMPLEMENT_VOIDSUSPEND(USRApplication, OnAppSuspend, invoker, reason, info) { // 未使用変数のワーニングを回避する unused(invoker); unused(reason); unused(info); // ここにアプリ中断時の処理を記述する return; } // アプリ終了確認ハンドラ XANDLER_IMPLEMENT_BOOLVOID(USRApplication, OnAppNoClose, invoker) { // 未使用変数のワーニングを回避する unused(invoker); // アプリの終了を拒否する場合は true を返す return false; } // アプリスリープ確認ハンドラ XANDLER_IMPLEMENT_BOOLVOID(USRApplication, OnAppNoSleep, invoker) { // 未使用変数のワーニングを回避する unused(invoker); // アプリのスリープを拒否する場合は true を返す return false; } // キーハンドラ XANDLER_IMPLEMENT_BOOLEVENT(USRApplication, OnKey, invoker, event) { // 未使用変数のワーニングを回避する unused(invoker); // ここにキーのキーイベントを受信したときの処理を記述する // セレクトキーが押されたらアプリを終了する switch (event.GetP16()) { case AVK_SELECT: Terminate(); return true; } return false; } // キー押下ハンドラ XANDLER_IMPLEMENT_BOOLEVENT(USRApplication, OnKeyPress, invoker, event) { // 未使用変数のワーニングを回避する unused(invoker); unused(event); // ここにキーが押下状態になったときの処理を記述する return false; } // キー解放ハンドラ XANDLER_IMPLEMENT_BOOLEVENT(USRApplication, OnKeyRelease, invoker, event) { // 未使用変数のワーニングを回避する unused(invoker); unused(event); // ここにキーが解放状態になったときの処理を記述する return false; }
SophiaFramework UNIVERSE のアプリケーションウィザードが自動生成する、 HelloWorld アプリのアプリケーションクラスの最小コードです。
例 9.44. 宣言
// // USRApplication.hpp // // This source code was automatically // generated by SophiaFramework UNIVERSE 5.3. // #ifndef __USRAPPLICATION_HPP #define __USRAPPLICATION_HPP #define TARGET_BUILD_DEBUG #include <SophiaFramework.hpp> #include "USRApplication.bid" SFMTYPEDEFCLASS(USRApplication) class USRApplication: public SFYApplication { SFMSEALCOPY(USRApplication) public: static SFCInvokerPtr Factory(Void); private: explicit USRApplication(Void) static_throws; virtual ~USRApplication(Void); }; #endif // __USRAPPLICATION_HPP //
例 9.45. 実装
// // USRApplication.cpp // // This source code was automatically // generated by SophiaFramework UNIVERSE 5.3. // #include "USRApplication.hpp" // ブートローダ SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license) { // ここにライセンスコードを記述する *license = "heap://"; return (id == AEECLSID_USRAPPLICATION) ? (&USRApplication::Factory): (null); } // ファクトリ関数: ユーザー定義アプリケーションクラスのインスタンスを生成する関数 SFCInvokerPtr USRApplication::Factory(Void) { return ::new USRApplication; } // コンストラクタ USRApplication::USRApplication(Void) static_throws { // ここに各種ハンドラの登録を記述する } // デストラクタ USRApplication::~USRApplication(Void) { }
以下の方法により、 アプリケーションクラスが内部で保持するテキスト入力コントロールエディタ (デフォルト: SFXEditor)を変更できます。
Tip | |
---|---|
テキスト入力に関して機種依存の問題が発生した場合は、 ユーザー定義テキスト入力コントロールエディタを定義・実装し、 デフォルトのテキスト入力コントロールエディタ(SFXEditor)を置き換えます。 以下の SFXEditor クラスの実装にある、 Open 関数や OnBypass 関数の内容を変更することで、 テキスト入力に関する機種依存の問題を解決できます。 |
例 9.46. テキスト入力コントロールエディタを変更する方法
// 1. SFXBaseEditor の派生クラスとしてユーザー定義テキスト入力コントロールエディタ SFXUserEditor クラスを作成する class SFXUserEditor : public SFXBaseEditor { // ...(省略)... }; // 2. SFXUserEditor インスタンスを作成しコンストラクタの引数として渡す // ファクトリ関数 SFCInvokerPtr USRApplication::Factory(Void) { return ::new USRApplication(::new SFXUserEditor); } // 3. SFYApplication クラスの引数ありコンストラクタで SFXUserEditor インスタンスをセットする // コンストラクタ USRApplication::USRApplication(SFXBaseEditorPtr editor) : SFYApplication(editor) static_throws { if (static_try()) { // ...(省略)... } }
デフォルトのテキスト入力コントロールエディタである、 SFXEditor クラスの実装は以下の通りです。
例 9.47. SFXEditor クラスの実装
------------------------------------------------------------------------------------------------------------ /** *** File : SFXEditor.f.hpp **/ #ifndef __SOPHIAFRAMEWORK_SFXEDITOR_FHPP #define __SOPHIAFRAMEWORK_SFXEDITOR_FHPP #include <SFXGeneral/SFXEnvironment.h.hpp> SFMTYPEDEFCLASS(SFXEditor) #endif // __SOPHIAFRAMEWORK_SFXEDITOR_FHPP // ------------------------------------------------------------------------------------------------------------ /** *** File : SFXEditor.h.hpp **/ #ifndef __SOPHIAFRAMEWORK_SFXEDITOR_HHPP #define __SOPHIAFRAMEWORK_SFXEDITOR_HHPP #include <SFXGeneral/SFXEnvironment.h.hpp> #include <SFXGeneral/SFXBaseEditor.h.hpp> #include <SFXGeneral/SFXEditor.f.hpp> #include <SFXGeneral/SFXEditProperty.f.hpp> #include <SFCCore/SFCApplication.h.hpp> #include <SFBWrapper/SFBTextCtl.h.hpp> class SFXEditor : public SFXBaseEditor { SFMSEALCOPY(SFXEditor) private: SFBTextCtlSmp _textctl; SFBMenuCtlSmp _menuctl; SFXEditPropertyPtr _property; CallbackSPP _spp; VoidPtr _reference; public: explicit SFXEditor (Void); virtual ~SFXEditor (Void); virtual SFCError Open (SFXEditPropertyPtr property, CallbackSPP spp, VoidPtr reference); Void Close (Void); private: XALLBACK_DECLARE_SFCAPPLICATION(OnBypass) }; #include <SFXGeneral/SFXEditor.i.hpp> #endif // __SOPHIAFRAMEWORK_SFXEDITOR_HHPP // ------------------------------------------------------------------------------------------------------------ /** *** File : SFXEditor.i.hpp **/ #ifndef __SOPHIAFRAMEWORK_SFXEDITOR_IHPP #define __SOPHIAFRAMEWORK_SFXEDITOR_IHPP #endif // __SOPHIAFRAMEWORK_SFXEDITOR_IHPP // ------------------------------------------------------------------------------------------------------------ /** *** File : SFXEditor.i.cpp **/ #include <SFXGeneral/SFXEditor.h.hpp> #include <SFXGeneral/SFXDevice.h.hpp> #include <SFXGeneral/SFXEditProperty.h.hpp> #define ITEM_NAME ("Done") #define LABEL_OK 0 /*public */SFXEditor::SFXEditor(Void) : _property(null) { }// SFXEditor::SFXEditor // /*public */SFXEditor::~SFXEditor(Void) { Close(); }// SFXEditor::~SFXEditor // /*public virtual*/SFCError SFXEditor::Open(SFXEditPropertyPtr property, CallbackSPP spp, VoidPtr reference) { #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH static SFXRGBColor::AtomRecConst color[] = { {{{0x00, 0xFF, 0xFF, 0xFF}}}, {{{0x00, 0x00, 0x00, 0x00}}} }; #endif SFBDisplaySmp display; SFXWideString string; SFXRectangle remember; SFXRectangle rectangle; UInt32 flag; SFCError error(SFERR_NO_ERROR); if (property != null) { _property = property; if ((display = SFBDisplay::GetInstance()) != null) { display->GetClipRect(&remember); display->SetClipRect(SFXRectangle::EmptyInstance()); if ((_textctl = SFBTextCtl::NewInstance(GetSFBTextCtlClassID(), &error)) != null) { if ((_menuctl = SFBMenuCtl::NewInstance(GetSFBMenuCtlClassID(), &error)) != null) { if ((error = string.Set(ITEM_NAME)) == SFERR_NO_ERROR) { if (_menuctl->AddItem(LABEL_OK, &string, reinterpret_cast<UInt32>(_menuctl.Get()))) { _textctl->SetSoftKeyMenu(_menuctl); #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH flag = TP_FRAME | TP_MULTILINE | TP_FIXSETRECT; #else flag = TP_NODRAW | TP_FRAME | TP_NOUPDATE | TP_FIXSETRECT; #endif if (_property->GetPasswordMode()) { flag |= TP_PASSWORD; } _textctl->SetProperties(flag); rectangle.Set(SFXGrid::ZeroInstance(), SFXDevice().GetScreenSize()); rectangle.SubBottom(_menuctl->GetRect().GetHeight()); _textctl->SetRect(rectangle); _textctl->SetMaxSize(_property->GetMaximumLength()); _textctl->SetInputMode(_property->GetInputMode()); if (_textctl->SetText(_property->GetText())) { if ((error = RegisterBypass(XALLBACK_INTERNAL(OnBypass))) == SFERR_NO_ERROR) { _spp = spp; _reference = reference; } } else { error = SFERR_FAILED; } } else { error = SFERR_FAILED; } } } } if (error != SFERR_NO_ERROR) { Close(); } display->SetClipRect(remember); if (error == SFERR_NO_ERROR) { #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH display->SetColor(CLR_USER_TEXT, color[1]); display->SetColor(CLR_USER_BACKGROUND, color[0]); display->SetColor(CLR_USER_LINE, color[1]); #endif _textctl->SetActive(true); _textctl->SetCursorPos(TC_CURSORSTART); } } else { error = SFERR_FAILED; } } else { error = SFERR_INVALID_PARAM; } return error; }// SFXEditor::Open // /*public */Void SFXEditor::Close(Void) { if (_textctl != null) { _textctl->SetSoftKeyMenu(SFBMenuCtlSmp::EmptyInstance()); _textctl->SetActive(false); } UnregisterBypass(XALLBACK_INTERNAL(OnBypass)); _textctl.Release(); _menuctl.Release(); _property = null; return; }// SFXEditor::Close // /*private */XALLBACK_IMPLEMENT_SFCAPPLICATION(SFXEditor, OnBypass, event) { SFXWideString string; SFCError error; Bool result(false); result = _textctl->HandleEvent(event); if (!result) { #if defined TARGET_ENVIRONMENT_SIMULATOR result = _menuctl->HandleEvent(event); #endif } switch (event.GetType()) { case SFEVT_APP_RESUME: result = true; break; case SFEVT_APP_SUSPEND: result = true; break; case SFEVT_KEY: case SFEVT_KEY_PRESS: case SFEVT_KEY_RELEASE: #if TARGET_VERSION_LT(3, 0, 0) case SFEVT_KEY_HELD: #endif result = true; break; case SFEVT_COMMAND: if (!result) { switch (event.GetP16()) { case LABEL_OK: if ((error = string.Set(_textctl->GetTextPtr())) == SFERR_NO_ERROR) { if ((error = _property->SetText(string.Substring(0, _property->GetMaximumLength()))) == SFERR_NO_ERROR) { _property->SetInputMode(_textctl->GetInputMode()); } } Close(); if (_spp != null) { (*_spp)(error, _reference); } if ((application = SFCApplication::GetInstance()) != null) { application->RenderDeviceScreen(); } break; default: break; } result = true; } break; default: break; } return result; }// XALLBACK_IMPLEMENT_SFCAPPLICATION(SFXEditor, OnBypass) //
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |