UNIVERSE アプリをフルスクリーンモード対応にする方法
■概要
ルート( SFZRoot )に設定する描画エンジンの初期化時( SFYRenderer::Initialize 関数呼び出し時)にパラメーターとしてレスポンダ空間を渡します。 このとき、SFBDisplay::SetPrefs 関数などを利用して携帯電話端末のフルスクリーン領域をレスポンダ空間に設定することが可能です。
■mif ファイルの設定など
SFBDisplay::SetPrefs 関数を使うためには、mif ファイルの AEEPRIVID_DISPSETTINGS 特権の設定が必要です。 この特権は、mif エディタで「依存ファイル」のタブを選択し、BREW SDK のインクルードファイルに含まれている外部クラス 「DISPSETTINGS (0x0103081D)」 を追加する必要があります。
なお、フルスクリーンモードはシミュレーターでは対応していません。動作確認は実機で行う必要があります。 また、フルスクリーンモードに対応していない機種も存在します。
■レスポンダ空間としてフルスクリーン領域を設定するコード
ウィンドウ、ダイアログ、メニューやフレームを配置する汎用ルート[SFZRoot]の実装コードと異なる点は太字の部分だけです。
SFCError USRApplication::Make(Void)
{
SFCError error(SFERR_NO_ERROR);
// 配信エンジンを作成する
error = _distributer.Initialize();
if (error == SFERR_NO_ERROR) {
// SFBDisplay インターフェースを取得する
if ((graphics = SFXGraphics::GetInstance()) != null) {
display = graphics->GetSFBDisplay();
// 携帯画面サイズを変更 (ピクトあり、フルスクリーン)
if ((error = display->SetPrefs("a:1,w:*,h:*"))
== SFERR_NO_ERROR) {
display->ResetClipRect();
// 描画エンジンを作成する
// SFBDisplay::SetPrefs 関数で設定したフルスクリーン領域が
//レスポンダ空間として設定される
error = _renderer.Initialize(SFXGraphics::GetDeviceRectangle());
if (error == SFERR_NO_ERROR) {
// ルートを作成する
if ((_root = SFZRoot::NewInstance(&error)) != null) {
// ルートに配信エンジンを登録する
_root->SetDistributer(&_distributer);
// ルートに描画エンジンを登録する
_root->SetRenderer(&_renderer);
// レスポンダ空間上にルートの実領域を設定する
_root->SetRealBound(_root->GetSuitableBound());
// ルートの状態を「可視+活性+操作可能+フォーカス」
// にまとめて設定する
_root->SetState(true, true, true, true);
}
}
}
}
}
return error;
}
■レスポンダ空間
レスポンダ空間とは、 描画エンジンに関連付けられたレスポンダツリーを描画する画面上の矩形領域のことです。
SFYRenderer::Initialize 関数を利用して描画エンジンを初期化するときに設定します。 レスポンダ空間設定後は、動的に拡大したり縮小したりできません。
多くの場合、レスポンダ空間として画面の全領域を設定します。
□サンプルコードダウンロード( fullscreen.zip : 40.3kb )
---------------------------------------------------------------------------------------------------------
■SFYApplication を継承するアプリケーションのフルスクリーン対応:
SFYApplication がデフォルトで保持するルート( SFZRoot )のレスポンダ空間をフルスクリーン対応にするには、以下のコードをアプリケーションクラスのコンストラクタに追加すれば、フルスクリーン対応が可能です。
// アプリケーションクラスのコンストラクタ
USRApplication::USRApplication(Void) static_throws
{
SFXGraphicsPtr graphics;
SFBDisplaySmp display;
SFBBitmapSmp bitmap;
AEEBitmapInfo info = {0};
SFYRendererPtr renderer;
SFZRootSmp root;
SFCError error(SFERR_NO_ERROR);
// レスポンダシステムの初期化
if ((graphics = SFXGraphics::GetInstance()) != null) {
display = graphics->GetSFBDisplay();
// 携帯画面サイズを変更する (ピクトあり、フルスクリーン)
if ((error = display->SetPrefs("a:1,w:*,h:*")) == SFERR_NO_ERROR) {
display->ResetClipRect();
if ((bitmap = display->GetDeviceBitmap()) != null) {
bitmap->GetInfo(&info);
if ((renderer = GetRenderer()) != null) {
// 描画エンジンを初期化する
renderer->Initialize(SFXRectangle(0, 0,
static_cast<SInt16>(info.cx),
static_cast<SInt16>(info.cy)));
if ((root = static_pointer_cast<SFZRoot>(GetRoot())) != null) {
// ルートの領域を再設定する
root->SetRealBound(root->GetSuitableBound());
}
}
}
}
}
// その他、初期化処理を記述する
return error;
}
□サンプルコードダウンロード( fullscreen_sfy.zip : 40.1kb )
独自のボタンを作成する
SFRButtonBase クラスを継承して、独自のボタンを作成します。
SFMTYPEDEFCLASS(UserButton)
class UserButton : public SFRButtonBase {
// コピー禁止マクロ
SFMSEALCOPY(UserButton)
public:
// コンストラクタとデストラクタの宣言
UserButton(SFRResponderPtr,
SFXRectangleConstRef, BehaviorType);
virtual ~UserButton(Void);
private:
// 描画ハンドラの宣言
virtual Void HandleContent(SFXGraphicsPtr);
// キー リリース ハンドラの宣言
virtual Void HandleRelease(Void);
};
// コンストラクタ
UserButton::UserButton(SFRResponderPtr director, SFXRectangleConstRef rect, BehaviorType behavior)
: SFRButtonBase(director, rect, behavior, four_char_code('U', 's', 'e', 'r'))
{
return;
}
// デストラクタ
UserButton::~UserButton(Void)
{
return;
}
// 描画ハンドラ
Void UserButton::HandleContent(SFXGraphicsPtr graphic)
{
SFXRGBColor color;
// 応答可能か
if (GetInheritEnable()) {
// フォーカスされているか
if (GetInheritFocus()) {
// キーが押されているか
if (GetStatusPress()) {
color.SetRGB(0x44, 0x44, 0x44);
}
else {
color.SetRGB(0x66, 0x66, 0x66);
}
}
else {
color.SetRGB(0x88, 0x88, 0x88);
}
}
else {
color.SetRGB(0xAA, 0xAA, 0xAA);
}
// ボタンを描画する
graphic->DrawRectangle(GetVirtualWorld(), color);
return;
}
// キー リリース ハンドラ
Void UserButton::HandleRelease(Void)
{
// SREVT_CONTROL イベントを自分自身に送信する
Invoke(SFXEvent(SREVT_CONTROL, 0,
reinterpret_cast<UInt32>(this)));
return;
}
// ウィンドウを生成する
window = ::new SFRPlainWindow(this, GetContentWorld());
// 独自のボタンを作成する
::new UserButton(window, SFXRectangle(10, 10, 40, 40));
ラジオ ボタンを作成する
SFRRadiobuttonControl クラスを使って、ラジオ ボタンを作成します。
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void) { return; }
// ラジオ ボタンをポインター型のメンバ変数として定義する
SFRRadiobuttonControlPtr _radiobutton1; // ラジオ ボタン1
SFRRadiobuttonControlPtr _radiobutton2; // ラジオ ボタン2
};
// コンストラクタ ( エラー処理は省略 )
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// ラジオ ボタンを作成する
// 第 1 引数 : 親レスポンダ
// 第 2 引数 : ラジオ ボタンの位置とサイズ
// 第 3 引数 : ラジオ ボタンの名前
_radiobutton1 = new SFRRadiobuttonControl(this,
SFXRectangle(20, 50, 150, 25),
"radiobutton1");
_radiobutton2 = new SFRRadiobuttonControl(this,
SFXRectangle(20, 80, 150, 25),
"radiobutton2");
// ラジオ ボタンのグループ化を行う
_radiobutton2->Group(_radiobutton1);
// radiobutton1 を選択状態にする
_radiobutton1->SetStatusCheck(true);
return;
}
コンボ ボックスを作成する
SFRComboboxControl を使って、コンボ ボックスを作成します。
SFMTYPEDEFCLASS(UserClass)
class UserClass : public SFRPlainWindow {
// コンストラクタなどは省略
private:
Void Main (Void);
HANDLER_DECLARE_VOIDCONTROL(ComboboxHandler)
};
// コンボ ボックスを作成する(エラー処理は省略)
Void UserClass::Main(Void)
{
SFRComboboxControlPtr combobox;
SFXWideString item[] = {"item1", "item2", "item3"};
combobox = new SFRComboboxControl(window,
SFXRectangle(5, 5, 48, 16),
item, lengthof(item));
combobox->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE,
HANDLER_FUNCTION(ComboboxHandler));
// item1 のアイテム項目にアクセスキーを設定する
combobox->SetAccessKey(0, AVK_1, 0x69F7);
// コンボ ボックスの色を設定する
// 設定しない場合はデフォルトの色になる
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_LIGHT,
SFXRGBColor(0x99, 0x99, 0x99, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_BASE,
SFXRGBColor(0x66, 0x66, 0x66, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_SHADOW,
SFXRGBColor(0x33, 0x33, 0x33, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_TITLE,
SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_LIGHT,
SFXRGBColor(0x99, 0x99, 0x99, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_BASE,
SFXRGBColor(0x66, 0x66, 0x6, 0x006));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_SHADOW,
SFXRGBColor(0x33, 0x33, 0x33, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_TITLE,
SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
return;
}
// コンボ ボックス ハンドラ( メニューが選択されたときに起動する )
HANDLER_IMPLEMENT_VOIDCONTROL(UserClass, ComboboxHandler, result, control) {
......
return;
}
チェック ボックスを作成する
SFRCheckboxControl を使って、チェック ボックスを作成します。
SFMTYPEDEFCLASS(UserClass)
class UserClass : public SFRPlainWindow {
// コンストラクタなどは省略
private:
Void Main (Void);
HANDLER_DECLARE_VOIDCONTROL(CheckboxHandler)
};
// チェック ボックスを作成する(エラー処理は省略)
Void UserClass::Main(Void)
{
SFRCheckboxControlPtr checkbox;
checkbox = new SFRCheckboxControl(window,
SFXRectangle(5, 5, 48, 16), "sample");
checkbox->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE,
HANDLER_FUNCTION(CheckboxHandler));
// チェック ボックスの色を設定する
// 設定しない場合はデフォルトの色になる
checkbox->SetColor(SFRCheckboxControl::COLOR_LIGHT,
SFXRGBColor(0x99, 0x99, 0x99, 0x00));
checkbox->SetColor(SFRCheckboxControl::COLOR_BASE,
SFXRGBColor(0x66, 0x66, 0x66, 0x00));
checkbox->SetColor(SFRCheckboxControl::COLOR_SHADOW,
SFXRGBColor(0x33, 0x33, 0x33, 0x00));
checkbox->SetColor(SFRCheckboxControl::COLOR_TITLE,
SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
return;
}
// チェック ボックス ハンドラ ( チェック ボックスのボタンがリリースされたときに起動する )
HANDLER_IMPLEMENT_VOIDCONTROL(UserClass, CheckboxHandler, result, control)
{
..............
return;
}
ボタンを作成する
SFRButtonControl を使って、ボタンを作成します。
SFMTYPEDEFCLASS(UserClass)
class UserClass : public SFRPlainWindow {
// コンストラクタなどは省略
private:
Void Main (Void);
HANDLER_DECLARE_VOIDCONTROL(ButtonHandler)
};
// ボタンを作成する(エラー処理は省略)
Void UserClass::Main(Void)
{
SFRButtonControlPtr button;
button = new SFRButtonControl(window,
SFXRectangle(5, 5, 48, 16), "sample");
button->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE,
HANDLER_FUNCTION(ButtonHandler));
// ボタンの色を設定する
// 設定しない場合はデフォルトの色になる
button->SetColor(SFRButtonControl::COLOR_LIGHT,
SFXRGBColor(0x99, 0x99, 0x99, 0x00));
button->SetColor(SFRButtonControl::COLOR_BASE,
SFXRGBColor(0x66, 0x66, 0x66, 0x00));
button->SetColor(SFRButtonControl::COLOR_SHADOW,
SFXRGBColor(0x33, 0x33, 0x33, 0x00));
button->SetColor(SFRButtonControl::COLOR_TITLE,
SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
return;
}
// ボタン ハンドラ ( ボタンがリリースされたときに起動する )
HANDLER_IMPLEMENT_VOIDCONTROL(UserClass, ButtonHandler, result, control)
{
..............
return;
}
エディット コントロール(テキスト入力ボックス)を作成する
SFREditboxControl クラスを使って、エディット コントロール(テキスト入力ボックス)を作成します。
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void) { return; }
// テキスト ボックスをポインター型のメンバ変数として定義する
SFREditboxControlPtr _editbox; // テキスト ボックス
HANDLER_DECLARE_VOIDCONTROL(OnEditboxControl)
};
// コンストラクタ (エラー処理は省略)
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// テキスト ボックスの作成
// 第 1 引数 : 親レスポンダ
// 第 2 引数 : テキスト ボックス の位置とサイズ
// 第 3 引数 : テキスト ボックス の名前
_editbox = new SFREditboxControl(this,
SFXRectangle(20, 50, 150, 25),
"Editbox");
// 最大文字数を設定する
_editbox->SetMaxSize(255);
// テキストの入力後やフォーカスが外れたときの
// イベントハンドラの設定
editbox->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnEditboxControl)));
}
// テキスト ボックス上でセレクトキーを押したときに
// 入力モードに移るようにセットする
// ( SelectHandler は SophiaFramework が
// 提供するセレクトキー用のハンドラ )
RegisterHandler(SFEVT_KEY,
AVK_SELECT,
HANDLER_AFTER,
HANDLER_FUNCTION(SelectHandler)));
}
return;
}
// エディット コントロール ハンドラ
// ( テキストの入力後、或いはフォーカスが外れたときに起動する )
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnEditboxControl, result, control)
{
// ターゲットを外す
control->SetStatusTarget(false);
if (result) { // テキストの入力後の場合
// フォーカスを次へ移動する
FocusNext();
} // フォーカスが外れた場合
else {
//...
}
}
タブを作成する
SFRTabControl クラスと SFRTabPane クラスを使って、タブを作成します。
// タブの定義
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void) { return; }
// タブをポインター型のメンバ変数として定義する
SFRTabControlPtr _tab; // タブ
SFRTabPanePtr _pane; // タブペイン
};
// コンストラクタ ( エラー処理は省略 )
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// タブを作成する
// 第 1 引数 : 親レスポンダ
// 第 2 引数 : タブの位置とサイズ
_tab = ::new SFRTabControl(this, SFXRectangle(20, 30, 150, 150));
// タブペインを作成する
_pane = new SFRTabPane(_tab, "page1");
_pane = new SFRTabPane(_tab, "page2");
return;
}
テキスト メニューを作成する
SFRTextMenu クラスを使って、テキスト メニューを作成します。
SFMTYPEDEFCLASS(UserClass)
class UserClass : public SFRPlainWindow {
// コンストラクタやエラー処理は省略
private:
Void Main (Void);
HANDLER_DECLARE_VOIDMENU(MenuHandler)
};
Void UserClass::Main(Void)
{
SFRTextMenuPtr menu;
// テキスト メニューの作成
menu = new SFRTextMenu(SFXRectangle(40, 30, 100, 150),
"メニュー", null, 0);
// AVK_1 はアクセス キー、0xFBF6 は絵文字
menu->AppendItem("項目1", AVK_1, 0xFBF6);
// AVK_2 はアクセス キー、0xFCF6 は絵文字
menu->AppendItem("項目2", AVK_2, 0xFCF6);
// ハンドラを登録する
menu->RegisterHandler(SREVT_MENU, HANDLER_BEFORE,
HANDLER_FUNCTION(MenuHandler));
return;
}
// メニュー ハンドラ
// ( メニューが選択されたとき、またはキャンセルされたときに起動する )
// 第 1 引数 : 所属クラス名
// 第 2 引数 : ハンドラの名前
// 第 3 引数 : result
// 第 4 引数 : menu ( へのポインター )
HANDLER_IMPLEMENT_VOIDMENU(UserClass, MenuHandler, result, menu)
{
if (result == SRP16_ESCAPE) { // キャンセルされたとき
TRACE("cancel");
} else { // メニューが選択されたとき( result に選択した項目の番号が入る )
TRACE("%s", SFRTextMenuPtr(menu)->GetTitle(result));
}
}
最高 3 つのボタンを持つ選択ダイアログを作成する
SFRMultiDialog クラスを使って、最高 3 つのボタンを持つ選択ダイアログを作成します。
class ExampleAppli : public SFRApplication {
...
// ダイアログ ハンドラの宣言
HANDLER_DECLARE_VOIDDIALOG(OnDialog)
SFRDialogPtr _dialog;
...
};
// ダイアログ ハンドラ
HANDLER_IMPLEMENT_VOIDDIALOG(ExampleAppli, OnDialog, result, dialog)
{
switch (result) {
case SRP16_OK: // OK ボタンが押されたとき
// 何か処理を行う
break;
case SRP16_CANCEL: // CANCEL ボタンが押されたとき
// 何か処理を行う
break;
case SRP16_ANOTHER: // ANOTHER ボタンの場合
// 何か処理を行う
break;
}
}
// 選択ダイアログを設定する
SFRMultiDialog::ParamRec param;
param.text = "アプリを終了しますか?";
param.ok = "はい";
param.cancel = "いいえ";
param.another = ""; // 空文字の場合、ボタンは表示されない
param.focus = SFRMultiDialog::FOCUS_OK, // フォーカスの位置
param.image = SFBImageSmp(null); // アイコンのイメージ
// ダイアログを作成する
_dialog= new SFRMultiDialog(SFXRectangle(20, 80, 200, 100),
"確認",
param);
// ダイアログ ハンドラを登録する
_dialog->RegisterHandler(SREVT_DIALOG,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnDialog));
最高 1 つのボタンを持つメッセージ ダイアログを作成する
SFRMessageDialog クラスを使って、最高 1 つのボタンを持つメッセージ ダイアログを作成します。
class ExampleAppli : public SFRApplication {
...
// ダイアログ ハンドラの宣言
HANDLER_DECLARE_VOIDDIALOG(OnDialog)
SFRDialogPtr _dialog;
...
};
// ダイアログ ハンドラ
HANDLER_IMPLEMENT_VOIDDIALOG(ExampleAppli, OnDialog, result, dialog)
{
... // 何らかの処理
// ダイアログを閉じる
_dialog->DialogHandler();
}
// ダイアログを作成する
_dialog = new SFRMessageDialog(SFXRectangle(20, 80, 200, 100),
"処理が完了しました。",
"OK");
// ダイアログ ハンドラを登録する
_dialog->RegisterHandler(SREVT_DIALOG,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnDialog));
タイトル付きのダイアログを作成する
SFRTitleDialog クラスを使って、"my dialog"のタイトルがついたウィンドウを作成します。
SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRTitleDialog {
SFMSEALCOPY(MyDialog)
public:
MyDialog(Void) static_throws;
virtual ~MyDialog(Void);
private:
// 描画ハンドラを宣言する
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};
// コンストラクタ
MyDialog::MyDialog() : SFRTitleDialog(SFXRectangle(20, 80, 200, 100), "my dialog") static_throws {
// 描画ハンドラを登録する
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
}
// デストラクタ
MyDialog::~MyDialog(Void)
{
return;
}
// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) {
// SFXGraphics インスタンスを使って描画する
// ダイアログの中を紫色に設定
// GetContentWorld() はウィンドウの中の
// 描画領域を表す長方形 ( SFXRectangle ) を返す
// SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
graphics->FillRectangle(GetContentWorld(),
SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));
// "Hello Window" を描画する
graphics->DrawText("Hello Window",
GetContentWorld(),
SFXRGBColor(0x00, 0x00, 0x00, 0x00));
}
// タイトル ダイアログを作成する
MyDialogPtr dialog;
dialog = new MyDialog();
フレーム付きのダイアログを作成する
SFRFrameDialog クラスを使って、フレーム付きのダイアログを作成します。
SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRFrameDialog {
SFMSEALCOPY(MyDialog)
public:
MyDialog(Void) static_throws;
virtual ~MyDialog(Void);
private:
// 描画ハンドラを宣言する
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};
// コンストラクタ
MyDialog::MyDialog() : SFRFrameDialog(SFXRectangle(20, 80, 200, 100)) static_throws {
// 描画ハンドラを登録する
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent));
}
// デストラクタ
MyDialog::~MyDialog(Void)
{
return;
}
// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) {
// SFXGraphics インスタンスを使って描画する
// ダイアログの中を紫色に設定
// GetContentWorld() はウィンドウの中の
// 描画領域を表す長方形 ( SFXRectangle ) を返す
// SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
graphics->FillRectangle(GetContentWorld(),
SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));
// "Hello Window" を描画する
graphics->DrawText("Hello Window",
GetContentWorld(),
SFXRGBColor(0x00, 0x00, 0x00, 0x00));
}
// フレーム ダイアログを作成する
MyDialogPtr dialog;
dialog = new MyDialog();
プレーンダイアログを作成する
SFRPlainDialog クラスを使って、プレーンダイアログを作成します。
SFMTYPEDEFCLASS(MyDialog)
class MyDialog : public SFRPlainDialog {
SFMSEALCOPY(MyDialog)
public:
MyDialog(Void) static_throws;
virtual ~MyDialog(Void);
private:
// 描画ハンドラを宣言する
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
};
// コンストラクタ
MyDialog::MyDialog() : SFRPlainDialog(SFXRectangle(20, 80, 200, 100)) static_throws {
// 描画ハンドラを登録する
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// デストラクタ
MyDialog::~MyDialog(Void)
{
return;
}
// 描画ハンドラ
HANDLER_IMPLEMENT_VOIDRENDER(MyDialog, OnRenderContent, graphics) {
// SFXGraphics インスタンスを使って描画する
// ダイアログの中を紫色に設定する
// GetContentWorld() はウィンドウの中の
// 描画領域を表す長方形 ( SFXRectangle ) を返す
// SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00) : 左から R, G, B, アルファ値
graphics->FillRectangle(GetContentWorld(),
SFXRGBColor(0xD8, 0xD8, 0xFF, 0x00));
}
// プレーン ダイアログを作成する
MyDialogPtr dialog;
dialog = new MyDialog();
タイトル付きのウィンドウを作成する
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();
ダイアログを閉じる方法
DialogHandler を使ってダイアログを閉じます。
// ダイアログの作成
SFRMultiDialog::ParamRec param; // マルチダイアログの構造体
param.text = "ダイアログを閉じます。よろしいですか"; // ダイアログに表示するテキスト
param.ok = "はい"; // 第 1 ボタンのテキスト
param.cancel = ""; // 第 2 ボタンのテキスト( 空テキスト:ボタン無し )
param.another = "; // 第 3 ボタンのテキスト( 空テキスト:ボタン無し )
param.focus = SFRMultiDialog::FOCUS_OK; // フォーカスの初期位置
param.image = SFBImageSmp(null); // アイコン画像
// ダイアログの作成
SFRMultiDialogPtr multiDialog = new SFRMultiDialog(SFXRectangle(10, 40, 220, 140),"終了?", param);
// ダイアログのハンドラの登録
if (static_try()) {
static_throw(multiDialog->RegisterHandler(SREVT_DIALOG, HANDLER_BEFORE,HANDLER_FUNCTION(OnDialog)));
// ダイアログで「はい」を選んだときに実行されるコード
HANDLER_IMPLEMENT_VOIDDIALOG(MyWindow, OnDialog, result, dialog) {
switch(result) {
case SRP16_OK: // 「はい」を選んだとき
dialog->DialogHandler(); // ダイアログを閉じる
break;
}
}
SFRBrowserControl クラスを使った HTML 作成
SFRBrowserControl クラスを使って HTML データを作成します。
SFMTYPEDEFCLASS(HTMLBrowserControl)
class HTMLBrowserControl : public SFRBrowserControl {
SFMSEALCOPY(HTMLBrowserControl)
public:
explicit HTMLBrowserControl(SFRResponderPtr director, SFXRectangleConstRef rectangle);
virtual ~HTMLBrowserControl(Void);
protected:
virtual Void JumpNotifyHandler(JumpNotifyConstRef info);
};
HTMLBrowserControlPtr _html;
HTMLSample::HTMLSample(Void) static_throws
{
// 表示するブラウザーを文字列で入力する
SFXAnsiString data =
"<form>"
"ユーザID :<input type=\"text\" maxlength=\"6\" name=\"id\" value=\"00000\"/><br/>"
"パスワード:<input type=\"text\" maxlength=\"6\" name=\"pass\" value=\"00000\"/><br/>"
"<br/>"
"<center>"
"<input type=\"submit\" value=\"送信\"/><input type=\"reset\" value=\"リセット\"/>"
"</center>"
"</form>"
;
// HTMLBrowserControl の生成
_html = new HTMLBrowserControl(this, GetContentWorld());
//文字列データを HTML とみなして、レンダリングを開始する
_html->Load(data);
// SFRBrowserControl クラスがターゲットされていないと内部を操作できないため、
// フォーカス、ターゲットを操作するためのハンドラを登録する
SFRToolbox::RegisterManipulateHandler(this);
return;
}
HTMLBrowserControl::HTMLBrowserControl(SFRResponderPtr director, SFXRectangleConstRef rectangle) : SFRBrowserControl(director, rectangle)
{
return;
}
HTMLBrowserControl::~HTMLBrowserControl(Void)
{
return;
}
// 送信ボタンを押した場合
Void HTMLBrowserControl::JumpNotifyHandler(JumpNotifyConstRef info)
{
// 処理を記述する
…
return;
}
MIF ファイルには「ネットワーク」と 「Web アクセス」の特権レベルを設定してください。
テキスト入力後に何も処理ができなくなる(SFRBrewTextControl / SFREditboxControl)
SophiaFramework 4.0.4 から SFREditboxControl クラスを一部、仕様変更しました。
[変更前] ターゲット状態かつ非ネイティブ入力状態でのクリアキーイベントはSFRBrewTextControl クラス自身によって処理されていました。
[変更後] ターゲット状態かつ非ネイティブ入力状態でのクリアキーイベントはSFREditboxControl クラス自身で処理されません。
[変更理由] 他のレスポンダ仕様と同様の動作を行うため。
テキスト入力後のイベント処理方法は以下のとおりです。
// エディットコントロールで、テキストの入力後やフォーカスが外れたときの
// イベントハンドラ
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnEditboxControl, result, control)
{
// ターゲットを外す
control->SetStatusTarget(false);
if (result) { // テキストの入力後なら
// フォーカスを次へ移動
FocusNext();
} else { // フォーカスが外れたなら
・・・
}
}
尚、SophiaFramework 4.0.4以降をご使用の方はSFRBrewTextControl クラスはSFREditboxControl クラスへのエイリアスですので置き換えてください。
キーを押してもキーハンドラが起動しない
キーハンドラを起動させるには、キーハンドラの定義の他に、登録が必要です。
キーハンドラはコンストラクタなどで登録します。
// コンストラクタ
MyWindow::MyWindow(Void)
{
// OnKey ハンドラをすべてのキーイベントに反応するように登録する
// (エラー処理は省略)
RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey));
}
クリアーキーだけに反応させる場合
RegisterHandler(SFEVT_KEY, AVK_CLR, HANDLER_AFTER,
HANDLER_FUNCTION(OnClear));
矢印キーだけに反応させる場合
// キーコードの範囲を指定して登録する (AVK_UP から AVK_RIGHT まで)
RegisterHandler(SFEVT_KEY, AVK_UP, AVK_RIGHT, HANDLER_AFTER,
HANDLER_FUNCTION(OnKey));