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

10.6. コントロール

コントロールは、ウインドウ内に配置するレスポンダです。

表 10.6. コントロールの種類

クラス名 解説
SFRButtonControl ボタンコントロールを表すレスポンダです。
SFRCheckboxControl チェックボックスコントロールを表すレスポンダです。
SFRRadiobuttonControl ラジオボタンコントロールを表すレスポンダです。
SFRLabelControl ラベルコントロールを表すレスポンダです。
SFRComboboxControl コンボボックスコントロールを表すレスポンダです。
SFREditboxControl エディットコントロールを表すレスポンダです。
SFRTabControl タブコントロールを表すレスポンダです。
SFRBrowserControl 簡易ウェブブラウザコントロールです。

コントロールの作成と破棄は レスポンダの作成 と同様です。

10.6.1. ボタン

例 10.26. ボタンの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // ボタンをポインタ型のメンバ変数として定義する 
    SFRButtonControlPtr      _button;       // ボタン

};

例 10.27. ボタンの作成

// コンストラクタ ( エラー処理は省略 )
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // ボタンの作成
    // 第 1 引数 : 親レスポンダ
    // 第 2 引数 : ボタンの位置とサイズ
    // 第 3 引数 : ボタンの名前
    _button = new SFRButtonControl(this, 
                                   SFXRectangle(20, 50, 150, 25),
                                   "button");

    return;
}

図 10.32. 実行結果

実行結果

参照: SFR GUI フレームワークを使う開発 : ボタン

10.6.2. チェックボックス

例 10.28. チェックボックスの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // チェックボックスをポインタ型のメンバ変数として定義する
    SFRCheckboxControlPtr    _checkbox;     // チェックボックス

};

例 10.29. チェックボックスの作成

// コンストラクタ ( エラー処理は省略 )
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // チェックボックスの作成
    // 第 1 引数 : 親レスポンダ
    // 第 2 引数 : チェックボックスの位置とサイズ
    // 第 3 引数 : チェックボックスの名前
    _checkbox = new SFRCheckboxControl(this, 
                                       SFXRectangle(20, 50, 150, 25),
                                       "checkbox");

    return;
}

図 10.33. 実行結果

実行結果

参照: SFR GUI フレームワークを使う開発 : チェックボックス

10.6.3. ラジオボタン

例 10.30. ラジオボタンの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // ラジオボタンをポインタ型のメンバ変数として定義する
    SFRRadiobuttonControlPtr _radiobutton1; // ラジオボタン1
    SFRRadiobuttonControlPtr _radiobutton2; // ラジオボタン2

};

例 10.31. ラジオボタンの作成

// コンストラクタ ( エラー処理は省略 )
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;
}

図 10.34. 実行結果

実行結果

参照: SFR GUI フレームワークを使う開発 : ラジオボタン

10.6.4. ラベル

例 10.32. ラベルの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // ラベルをポインタ型のメンバ変数として定義する
    SFRLabelControlPtr       _label;        // ラベル

};

例 10.33. ラベルの作成

// コンストラクタ ( エラー処理は省略 )
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // ラベルの作成
    // 第 1 引数 : 親レスポンダ
    // 第 2 引数 : ラベルの位置とサイズ
    // 第 3 引数 : ラベルの名前
    _label = ::new SFRLabelControl(this, 
                                   SFXRectangle(30, 50, 150, 25), 
                                   "LabelControl");
				
    return;
}

図 10.35. 実行結果

実行結果

10.6.5. コンボボックス

例 10.34. コンボボックスの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // コンボボックスをポインタ型のメンバ変数として定義する
    SFRComboboxControlPtr    _combobox;     // コンボボックス

};

例 10.35. コンボボックスの作成

// コンストラクタ ( エラー処理は省略 )
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    SFXWideString item[] = {"combobox1", 
                            "combobox2", 
                            "combobox3"};
    
    // コンボボックスの作成
    // 第 1 引数 : 親レスポンダ
    // 第 2 引数 : コンボボックスの位置とサイズ
    // 第 3 引数 : コンボボックスの名前
    _combobox = new SFRComboboxControl(this, 
                                       SFXRectangle(20, 50, 150, 25), 
                                       item, 
                                       lengthof(item));	

    return;
}

図 10.36. 実行結果

実行結果

参照: SFR GUI フレームワークを使う開発 : コンボボックス

10.6.6. テキストボックス

例 10.36. テキストボックス の定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // テキストボックスをポインタ型のメンバ変数として定義する
    SFREditboxControlPtr     _editbox;      // テキストボックス 

};

例 10.37. テキストボックスの作成

// コンストラクタ ( エラー処理は省略 )
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");

    return;
}

図 10.37. 実行結果

実行結果

参照: SFR GUI フレームワークを使う開発 : テキストボックス

10.6.7. タブ

例 10.38. タブの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    //タブをポインタ型のメンバ変数として定義する
    SFRTabControlPtr         _tab;          //タブ
    SFRTabPanePtr            _pane;         //タブに使うタブペイン

};

例 10.39. タブの作成

// コンストラクタ ( エラー処理は省略 )
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;
}

図 10.38. 実行結果

実行結果

10.6.8. 簡易ウェブブラウザ

例 10.40. 簡易ウェブブラウザの定義

SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
    SFMSEALCOPY(MyWindow)
public:
    MyWindow(Void) static_throws;
    virtual ~MyWindow(Void) { return; }
    
    // 簡易ウェブブラウザをポインタ型のメンバ変数として定義する
    SFRBrowserControlPtr     _browser;      // 簡易ウェブブラウザ

};

例 10.41. 簡易ウェブブラウザの作成

// コンストラクタ ( エラー処理は省略 )
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    
    // 表示するブラウザを文字列で入力
    SFXAnsiString buffer(
         "BrowserControl<br /><br />"
         "<a href=\"/example/tabbrowser/\">ソフィアクレイドル</a><br /><br />"
    );
				
    // 簡易ウェブブラウザの作成
    // 第 1 引数 : 親レスポンダ
    // 第 2 引数 :タブの位置とサイズ
    _browser = ::new SFRBrowserControl(this, rect);
				
    //文字列データを HTML とみなして、レンダリングを開始
   _browser->Load(buffer);
			
    return;
}

図 10.39. 実行結果

実行結果

10.6.9. フォーカス

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

図 10.40. フォーカス

フォーカス

「フォーカス」を移動する関数として、以下の関数が提供されています。

表 10.7. フォーカスを移動させる関数

関数名 解説
FocusPrevious 1つ前の兄弟レスポンダにフォーカスを移動します。
FocusNext 1つ後の兄弟レスポンダにフォーカスを移動します。
FocusUp 1つ上のレスポンダにフォーカスを移動します。
FocusDown 1つ下のレスポンダにフォーカスを移動します。
FocusLeft 1つ左のレスポンダにフォーカスを移動します。
FocusRight 1つ右のレスポンダにフォーカスを移動します。

例 10.42. フォーカス移動のコード

// キーハンドラ
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;
}

GetStatusFocus 関数を使えば、コントロールがフォーカスを持つか否かを判定できます。

また、GetFocus 関数を使えば、子階層のレスポンダでフォーカスを持つレスポンダを取得できます。

表 10.8. フォーカスに関するコントロールの関数

関数名 解説
GetStatusFocus フォーカス / 非フォーカス フラグを取得します。
GetFocus 所有関係の子階層のレスポンダでフォーカスを持つレスポンダを取得します。

例 10.43. フォーカスのコントロール

// 例 1
if (_button->GetStatusFocus()) { 
    // ボタンがフォーカスを持つとき
    ...
}

// 例 2
SFRResponderPtr responder;

// フォーカスを持つレスポンダを取得する
responder = GetFocus();

responder->SomethingFunction(); // メンバ関数を呼び出す

10.6.10. デフォルト設定

コントロールにはあらかじめデフォルトの動作が設定されています。

例えば、フォーカスを当てた状態でセレクトキーを押すと、下図のように動作します。

図 10.41. ボタンの場合

ボタンの場合

図 10.42. チェックボックスの場合

チェックボックスの場合

図 10.43. コンボボックスの場合

コンボボックスの場合

10.6.11. 状態の取得

コントロールは状態を取得するメンバ関数を持ちます。

例 10.44. コントロールの状態に応じた分岐処理

// _checkbox は SFRCheckboxControlPtr 型
if (_checkbox->GetStatusCheck()) { // _checkbox にチェックが入っているとき

   //... 処理を行う

}

// _combobox は SFRComboboxControlPtr 型
switch (_combobox->GetValue()) {  // コンボボックスのどの項目が選択されているか
    case 0:  // 選択された項目によって処理を分岐する
        ...
    case 1:
        ...
}

10.6.12. 無効化

コントロールは、選択できないように無効化したり、非表示にしたりできます。

表 10.9. コントロールを有効/無効、表示/非表示にする関数

関数名 解説
SetStatusEnable レスポンダの応答可能 / 不可能フラグを設定します。(引数 true : 有効、false : 無効)
GetStatusEnable レスポンダの応答可能 / 不可能フラグを取得します。
SetStatusVisible レスポンダの可視 / 不可視フラグを設定します。(引数 true : 表示、false : 非表示)
GetStatusVisible レスポンダの可視 / 不可視フラグを取得します。

例 10.45. コントロールの無効化

// チェックボックス2を無効にする
checkbox2->SetStatusEnable(false);

// ラジオボタン1を無効にする
radiobutton1->SetStatusEnable(false);

// ラジオボタン2を非表示にする
radiobutton2->SetStatusVisible(false);

図 10.44. 実行結果

実行結果

10.6.13. イベントハンドラ

コントロールにはイベントハンドラを登録できます。

下のコードでは、SFRButtonControl インスタンスには「ボタンを押したときに発生するイベント」、 SFRComboboxControl インスタンスには「コンボボックスの選択が変更されたときに発生するイベント」のハンドラを それぞれ登録しています。

例 10.46. ボタンのイベントハンドラ

class MyWindow : public SFRTitleWindow {
private:
    SFRButtonControlPtr _button;  // ボタンへのポインタ
public:
    // ボタンハンドラの宣言
    HANDLER_DECLARE_VOIDCONTROL(OnButtonControl)
};

// ボタンハンドラの定義
// 第 1 引数 : 所属クラス、第 2 引数 : ハンドラ名、第 3 引数 : 結果値 ( UInt16 型)、第 4 引数 : コントロールへのポインタ
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl, result, control)
{
    TRACE("Hello Button"); // デバッグ画面に "Hello Button" を表示
}

// コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // ボタンの作成
    _button = new SFRButtonControl(this, 
                                   SFXRectangle(10, 10, 50, 25),
                                   "button name");

    // イベントハンドラの登録
    _button->RegisterHandler(SREVT_CONTROL,
                             HANDLER_BEFORE, 
                             HANDLER_FUNCTION(OnButtonControl)));
}

ハンドラの宣言、定義には HANDLER_DECLARE_??????、HANDLER_IMPLEMENT_?????? マクロを、登録には RegisterHandler 関数を用います。

例 10.47. コンボボックスのイベントハンドラボタン

class MyWindow : public SFRTitleWindow {
private:
    SFRComboboxControlPtr _combobox;  // コンボボックスへのポインタ
public:
   // コンボボックスハンドラの宣言
    HANDLER_DECLARE_VOIDCONTROL(OnComboboxControl)
};

// コンボボックスハンドラの定義
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnComboboxControl, result, control)
{
    if (result == SRP16_ESCAPE) { // 項目が選択されずにキャンセルされたとき
        // 何も処理しない
    } else {
        // result は選択した項目番号
        // control はコンボボックスのポインタ
        // GetTitle で選択項目の文字列を取得
        SFXAnsiString string(static_cast<SFRComboboxControlPtr>(control)->GetTitle(result));

        // デバッグ画面に文字列表示
        // string.GetCString() で C 言語文字列を取得
        TRACE("'%d: %s' is selected.", result, string.GetCString());
    }
}

// コンストラクタ
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
    SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
    // コンボボックスの項目
    SFXWideString item[] = {"item1", 
                            "item2", 
                            "item3"};

    // コンボボックスの作成
    _combobox = new SFRComboboxControl(this, 
                                       SFXRectangle(10, 165, 90, 20), 
                                       item, 
                                       lengthof(item));

    // イベントハンドラの登録
    _combobox->RegisterHandler(SREVT_CONTROL,
                               HANDLER_BEFORE,
                               HANDLER_FUNCTION(OnComboboxControl)));
}