独自のボタンを作成する
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));
方向キーでコントロールを選択する
方向キーで「フォーカス」を制御してコントロールを選択します。コントロールは「フォーカス」が当たると色が変わります。
// キー ハンドラ
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;
}
ラジオ ボタンを作成する
SFRRadiobuttonControl クラスを使って、ラジオ ボタンを作成します。
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void) { return; }
// ラジオ ボタンをポインター型のメンバ変数として定義する
SFRRadiobuttonControlPtr _radiobutton1; // ラジオ ボタン1
SFRRadiobuttonControlPtr _radiobutton2; // ラジオ ボタン2
};
// コンストラクタ ( エラー処理は省略 )
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;
}
コンボ ボックスを作成する
SFRComboboxControl を使って、コンボ ボックスを作成します。
SFMTYPEDEFCLASS(UserClass)
class UserClass : public SFRPlainWindow {
// コンストラクタなどは省略
private:
Void Main (Void);
HANDLER_DECLARE_VOIDCONTROL(ComboboxHandler)
};
// コンボ ボックスを作成する(エラー処理は省略)
Void UserClass::Main(Void)
{
SFRComboboxControlPtr combobox;
SFXWideString item[] = {"item1", "item2", "item3"};
combobox = new SFRComboboxControl(window,
SFXRectangle(5, 5, 48, 16),
item, lengthof(item));
combobox->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE,
HANDLER_FUNCTION(ComboboxHandler));
// item1 のアイテム項目にアクセスキーを設定する
combobox->SetAccessKey(0, AVK_1, 0x69F7);
// コンボ ボックスの色を設定する
// 設定しない場合はデフォルトの色になる
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_LIGHT,
SFXRGBColor(0x99, 0x99, 0x99, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_BASE,
SFXRGBColor(0x66, 0x66, 0x66, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_SHADOW,
SFXRGBColor(0x33, 0x33, 0x33, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_BUTTON_TITLE,
SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_LIGHT,
SFXRGBColor(0x99, 0x99, 0x99, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_BASE,
SFXRGBColor(0x66, 0x66, 0x6, 0x006));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_SHADOW,
SFXRGBColor(0x33, 0x33, 0x33, 0x00));
combobox->SetColor(SFRComboboxControl::COLOR_MENU_TITLE,
SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
return;
}
// コンボ ボックス ハンドラ( メニューが選択されたときに起動する )
HANDLER_IMPLEMENT_VOIDCONTROL(UserClass, ComboboxHandler, result, control) {
......
return;
}
チェック ボックスを作成する
SFRCheckboxControl を使って、チェック ボックスを作成します。
SFMTYPEDEFCLASS(UserClass)
class UserClass : public SFRPlainWindow {
// コンストラクタなどは省略
private:
Void Main (Void);
HANDLER_DECLARE_VOIDCONTROL(CheckboxHandler)
};
// チェック ボックスを作成する(エラー処理は省略)
Void UserClass::Main(Void)
{
SFRCheckboxControlPtr checkbox;
checkbox = new SFRCheckboxControl(window,
SFXRectangle(5, 5, 48, 16), "sample");
checkbox->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE,
HANDLER_FUNCTION(CheckboxHandler));
// チェック ボックスの色を設定する
// 設定しない場合はデフォルトの色になる
checkbox->SetColor(SFRCheckboxControl::COLOR_LIGHT,
SFXRGBColor(0x99, 0x99, 0x99, 0x00));
checkbox->SetColor(SFRCheckboxControl::COLOR_BASE,
SFXRGBColor(0x66, 0x66, 0x66, 0x00));
checkbox->SetColor(SFRCheckboxControl::COLOR_SHADOW,
SFXRGBColor(0x33, 0x33, 0x33, 0x00));
checkbox->SetColor(SFRCheckboxControl::COLOR_TITLE,
SFXRGBColor(0xBB, 0xBB, 0xBB, 0x00));
return;
}
// チェック ボックス ハンドラ ( チェック ボックスのボタンがリリースされたときに起動する )
HANDLER_IMPLEMENT_VOIDCONTROL(UserClass, CheckboxHandler, result, control)
{
..............
return;
}
ボタンを作成する
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;
}
エディット コントロール(テキスト入力ボックス)を作成する
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 {
//...
}
}
タブを作成する
SFRTabControl クラスと SFRTabPane クラスを使って、タブを作成します。
// タブの定義
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void) { return; }
// タブをポインター型のメンバ変数として定義する
SFRTabControlPtr _tab; // タブ
SFRTabPanePtr _pane; // タブペイン
};
// コンストラクタ ( エラー処理は省略 )
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;
}