前のページ次のページ上に戻るホーム SophiaFramework 2.2

10.12. コントロール

コントロールはパソコンで言うところのボタンやチェックボックス、 ラジオボタンなどです。ウィンドウやダイアログ上に生成して ユーザに対してインターフェースを提供します。 コントロールを使用する方法も他のレスポンダと同じですので 簡単に使用することができます。

10.12.1. コントロールの生成

コントロールを作成するには作成したいコントロールのインスタンスを new 演算子で生成します。

以下にチェック ボックス コントロールを貼り付けたウィンドウの サンプル コードを示します。

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
  public:
    inline MyWindow(SFRApplicationPtr app) : SFRTitleWindow(app, SFURect(10, 10, 100, 100), "Hello")
    {
      SFRControlPtr  control;

      if (Exception() == NO_ERROR) {
        control = new SFRCheckboxControl(this, SFURect(5, 5, 0, 0), "Checkbox");
        if (control != NULL) {
          if (Exception(control->Exception()) != NO_ERROR) {
            delete control;
          }
        }
        else {
          Exception(ENOMEMORY);
        }
      }
      return;
    }
	
    virtual inline ~MyWindow(Void)
    {
      return;
    }
};

10.12.2. イベントの処理

上記コードではチェック ボックスが表示されセレクト キーが押されるたびに チェックが点いたり消えたりする動作をします。 コントロールの動作をカスタマイズするには、SREVT_CONTROL イベントを 受け取るハンドラを登録します。以下にサンプル コードを示します。

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
  public:
    inline MyWindow(SFRApplicationPtr app) : SFRTitleWindow(app, SFURect(10, 10, 100, 100), "Hello")
    {
      SFRControlPtr  control;

      if (Exception() == NO_ERROR) {
        control = new SFRCheckboxControl(this, SFURect(5, 5, 0, 0), "Checkbox");
        if (control != NULL) {
          if (Exception(control->Exception()) == NO_ERROR) {
            Exception(control->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE, Control_static, this));
          }
          else {
            delete control;
          }
        }
        else {
          Exception(ENOMEMORY);
        }
      }
      return;
    }
	
    virtual inline ~MyWindow(Void)
    {
      return;
    }

    static inline Bool Control_static(ConstSFUEventRef event, VoidPtr responder)
    {
      MyWindowPtr(responder->Control_handler(event.p16(), SFRCheckboxControlPtr(event.p32()));
      return(TRUE);
    }
	
    inline Void Control_handler(UInt16 value, SFRCheckboxControlPtr control)
    {
      switch (value) {
        case ...
          // something to do
          break;
      }
      return;
    }
};

上記コードではセレクト キーが押されてキー リリースのタイミングで Control_handler 関数が呼び出されます。Control_handler には そのときのコントロールの値とオブジェクトのポインタが渡されますので それを利用して処理を行います。 他のコントロールでもほぼ同じで、現在のバージョンではボタン系コントロールは キー リリース時に SFREVT_CONTROL イベントを送信する仕様になっています。

10.12.3. コントロールの種類

SophiaFramework にはすぐに使える便利な標準コントロールが 複数用意されています。これらのコントロールは、生成するだけで 使用することができ、各場所の色を設定できたり、フォントの種類を 変更したりできます。

標準コントロールには以下のようなものがあります。 SFRLabelControlSFRButtonControlSFRCheckboxControlSFRRadiobuttonControlSFRComboboxControlSFRTabControlSFRAnimationControlSFRBrowserControlSFRBrewTextControl です。

それぞれのコントロールは継承して使用することはできません。ユーザ独自の コントロールを簡単に作成するためには、以下のクラスを継承します。 詳細は各クラスの解説を参照してください。 SFRLabelBaseSFRButtonBaseSFRCheckboxBaseSFRRadiobuttonBase

また、用意されているコントロールとまったく異なるコントロールを定義する場合は、 SFRControl から継承します。