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

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

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

独自のボタンを作成する

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

ボタンを作成する

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