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

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

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

エディット コントロール(テキスト入力ボックス)を作成する

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 {
        //...
    }
}
      

テキスト入力後に何も処理ができなくなる(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 クラスへのエイリアスですので置き換えてください。