前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

10.5. コントロール

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

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

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

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

10.5.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.5.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.5.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.5.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.5.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.5.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.5.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.5.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=\"http://www.s-cradle.com/example/tabbrowser/\">ソフィアクレイドル</a><br /><br />"
    );
				
    // 簡易 ウェブ ブラウザーの作成
    // 第 1 引数 : 親レスポンダ
    // 第 2 引数 : タブの位置とサイズ
    _browser = ::new SFRBrowserControl(this, rect);
				
    //文字列データを HTML とみなして、レンダリングを開始
   _browser->Load(buffer);
			
    return;
}

図 10.39. 実行結果

実行結果

10.5.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.5.10. デフォルト設定

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

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

図 10.41. ボタンの場合

ボタンの場合

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

チェック ボックスの場合

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

コンボ ボックスの場合

10.5.11. 状態の取得

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

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

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

   //... 処理を行う

}

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

10.5.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.5.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)));
}