ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : GUIフレームワーク

C++ で作成されたBREW アプリで、レスポンダ(GUIフレームワーク)を扱う方法です。
SophiaFramework を用いています。

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;
}
      

ラベルを作成する

SFRLabelControl クラスを使って、ラベルを作成します。

// エラー処理は省略
Void UserClass::Main(Void)
{
  SFRLabelControlPtr  label;

  label = ::new SFRLabelControl(window, 
                                SFXRectangle(5, 5, 48, 16), "sample");
  
  // ラベルのタイトルの色を設定設定する
  // 設定しない場合はデフォルトの色になる
  label->SetColor(SFRLabelControl::COLOR_TITLE, 
                  SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
  
  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 クラスへのエイリアスですので置き換えてください。

      

リストボックスを使いたい

SophiaFramework のパッケージには、リストを表示するコントロールは含まれておりません。

リストコントロールは下記 URL サイトにてオープンソースで公開しています。

/products/sophiaframework/pclock/index.html
/products/sophiaframework/pself/index.html

に含まれる 「SGRListboxControl」 です。

      

テキストを表示する GUI コントロール

テキストを表示する GUI コントロールとして、SFRLabelControl クラスがあります。

テキストをスクロールして表示できるクラスはありません。
仮想領域のスクロールを利用して実現できます。

参照 SFRLabelControl | リファレンス 7.6 仮想領域 (領域のスクロール)

      

キーを押してもキーハンドラが起動しない

キーハンドラを起動させるには、キーハンドラの定義の他に、登録が必要です。

キーハンドラはコンストラクタなどで登録します。

// コンストラクタ
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));