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

BREW C++ プログラミング 逆引きコード集 : コントロール

C++ で作成されたBREW アプリで、レスポンダ(GUIフレームワーク)を使った各種コントロールの処理を行う方法です。
SophiaFramework を用いています。

独自のボタンを作成する

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

方向キーでコントロールを選択する

方向キーで「フォーカス」を制御してコントロールを選択します。コントロールは「フォーカス」が当たると色が変わります。

// キー ハンドラ
HANDLER_IMPLEMENT_BOOLEVENT(MyWindow, OnKey, event)
{
    switch (event.GetP16()) {
        // フォーカスを移動する
        case AVK_UP:          // 上
            FocusUp();
            return true;
        case AVK_LEFT:       // 左
            FocusLeft();
            return true;
        case AVK_DOWN:     // 下
            FocusDown();
            return true;
        case AVK_RIGHT:    // 右
            FocusRight();
            return true;
    }
    return false;
}
      

ラジオ ボタンを作成する

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