![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1 |
図のようにボタンを配置するコードを追加します。
例 3.13. ボタンの作成
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// *** 太字が追加部分
// ボタンを作成する
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
return;
}
![]() |
注意 |
|---|---|
SophiaFramework では、ポインター型は Ptr で表します。SFRButtonControlPtr は SFRButtonControl* と同じ意味です。 | |
セレクトキーでボタンを押します。
キー ハンドラにフォーカス移動のコードを追加します。
例 3.14. キー ハンドラの実装
HANDLER_IMPLEMENT_BOOLEVENT(MyWindow, OnKey, event)
{
// キー イベントの処理
switch (event.GetP16()) {
case AVK_CLR: // クリアー キーが押されたとき
// ウィンドウを破棄する
return Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
SRP16_TERMINATE_INVOKE,
true));
case AVK_1: // 1 キーが押されたとき
// デバッグ文字列をシミュレータのデバッグ用画面に表示する
TRACE("1-key");
return true;
// *** 太字が追加部分
// フォーカスを移動する
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;
}
方向キーを押すことでフォーカスの移動が確認できます。
ボタンが押されたときに実行するコードを追加します。
例 3.15. ボタン ハンドラの宣言
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
private:
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
// *** 太字が追加部分
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};
例 3.16. ボタン ハンドラの実装
// ボタン OnButtonControl1 のハンドラの定義 HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl1, result, control) { TRACE("Hello Button"); // デバッグ画面に "Hello Button" を表示する } // ボタン OnButtonControl2 のハンドラの定義 HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl2, result, control) { // ウィンドウを閉じる Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true)); }
例 3.17. ボタン ハンドラの登録
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// *** 太字が追加部分
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
}
図のようにチェック ボックスを配置するコードを追加します。
例 3.18. チェック ボックスの定義
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
// *** 太字が追加部分
private:
// ポインター型のメンバ変数として定義する
SFRCheckboxControlPtr _checkbox1;
SFRCheckboxControlPtr _checkbox2;
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};
例 3.19. チェック ボックスの作成
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
// *** 太字が追加部分
// チェック ボックスの作成
_checkbox1 = new SFRCheckboxControl(this,
SFXRectangle(10, 115, 90, 20),
"check1");
_checkbox2 = new SFRCheckboxControl(this,
SFXRectangle(105, 115, 90, 20),
"check2");
}
ボタン button3 を押すと、チェック ボックスの状態を取得するコードを追加します。
例 3.20. ボタン button3 のハンドラの宣言
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
private:
// ポインター型のメンバ変数として定義する
SFRCheckboxControlPtr _checkbox1;
SFRCheckboxControlPtr _checkbox2;
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
// *** 太字が追加部分
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)
};
button3 を押すと チェック ボックスの状態を取得します。
例 3.21. ボタン button3 のハンドラの実装
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl3, result, control) {
if (_checkbox1->GetStatusCheck()) {
// checkbox1 がチェックされているとき
TRACE("checkbox1: checked");
} else {
TRACE("checkbox1: unchecked");
}
if (_checkbox2->GetStatusCheck()) {
// checkbox2 がチェックされているとき
TRACE("checkbox2: checked");
} else {
TRACE("checkbox2: unchecked");
}
}
例 3.22. ボタン button3 のハンドラの登録
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
// *** 太字が追加部分
// button3 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button3->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl3)));
}
// チェック ボックスの作成
_checkbox1 = new SFRCheckboxControl(this,
SFXRectangle(10, 115, 90, 20),
"check1");
_checkbox2 = new SFRCheckboxControl(this,
SFXRectangle(105, 115, 90, 20),
"check2");
}
図のようにラジオ ボタンを配置するコードを追加します。
例 3.23. ラジオ ボタンの定義
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
// *** 太字が追加部分
private:
// ポインター型のメンバ変数として定義する
SFRCheckboxControlPtr _checkbox1;
SFRCheckboxControlPtr _checkbox2;
SFRRadiobuttonControlPtr _radiobutton1;
SFRRadiobuttonControlPtr _radiobutton2;
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};
例 3.24. ラジオ ボタンの作成
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
if (static_try()) {
static_throw(
button3->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl3)));
}
// チェック ボックスの作成
_checkbox1 = new SFRCheckboxControl(this,
SFXRectangle(10, 115, 90, 20),
"check1");
_checkbox2 = new SFRCheckboxControl(this,
SFXRectangle(105, 115, 90, 20),
"check2");
// *** 太字が追加部分
// ラジオ ボタンの作成
_radiobutton1 = new SFRRadiobuttonControl(this,
SFXRectangle(10, 140, 90, 20),
"radio1");
_radiobutton2 = new SFRRadiobuttonControl(this,
SFXRectangle(105, 140, 90, 20),
"radio2");
// ラジオ ボタンのグループ化
_radiobutton2->Group(_radiobutton1);
// radiobutton1 を選択状態にする
_radiobutton1->SetStatusCheck(true);
}
ラジオ ボタンは Group 関数を用いてグループ化します。
![]() |
ラジオ ボタンの状態取得 |
|---|---|
ラジオ ボタンの状態取得も GetStatusCheck() 関数で状態取得できます。 | |
図のようにコンボ ボックスを配置するコードを追加します。
例 3.25. コンボ ボックスの定義
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
// *** 太字が追加部分
private:
// ポインター型のメンバ変数として定義する
SFRCheckboxControlPtr _checkbox1;
SFRCheckboxControlPtr _checkbox2;
SFRRadiobuttonControlPtr _radiobutton1;
SFRRadiobuttonControlPtr _radiobutton2;
SFRComboboxControlPtr _combobox;
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
};
例 3.26. コンボ ボックスの作成
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
if (static_try()) {
static_throw(
button3->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl3)));
}
// チェック ボックスの作成
_checkbox1 = new SFRCheckboxControl(this,
SFXRectangle(10, 115, 90, 20),
"check1");
_checkbox2 = new SFRCheckboxControl(this,
SFXRectangle(105, 115, 90, 20),
"check2");
// ラジオ ボタンの作成
_radiobutton1 = new SFRRadiobuttonControl(this,
SFXRectangle(10, 140, 90, 20),
"radio1");
_radiobutton2 = new SFRRadiobuttonControl(this,
SFXRectangle(105, 140, 90, 20),
"radio2");
// ラジオ ボタンのグループ化
_radiobutton2->Group(_radiobutton1);
// radiobutton1 を選択状態にする
_radiobutton1->SetStatusCheck(true);
// *** 太字が追加部分
// コンボ ボックスの作成
SFXWideString item[] = {"item1", "item2", "item3"};
_combobox = new SFRComboboxControl(this,
SFXRectangle(10, 165, 90, 20),
item,
lengthof(item));
}
コンボ ボックスでは、項目が選択されたときに実行されるハンドラを登録できます。
例 3.27. コンボ ボックス ハンドラの宣言
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
// *** 太字が追加部分
private:
// ポインター型のメンバ変数として定義する
SFRCheckboxControlPtr _checkbox1;
SFRCheckboxControlPtr _checkbox2;
SFRRadiobuttonControlPtr _radiobutton1;
SFRRadiobuttonControlPtr _radiobutton2;
SFRComboboxControlPtr _combobox;
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)
HANDLER_DECLARE_VOIDCONTROL(OnComboboxControl)
};
例 3.28. コンボ ボックスのハンドラの実装
// Combobox の項目が選択されたときに、起動されるハンドラ 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 の引数は C 言語文字列 ) TRACE("'%d: %s' is selected.", _combobox->GetValue(), string.GetCString()); } }
例 3.29. コンボ ボックスのハンドラの登録
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
// button3 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button3->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl3)));
}
// チェック ボックスの作成
_checkbox1 = new SFRCheckboxControl(this,
SFXRectangle(10, 115, 90, 20),
"check1");
_checkbox2 = new SFRCheckboxControl(this,
SFXRectangle(105, 115, 90, 20),
"check2");
// ラジオ ボタンの作成
_radiobutton1 = new SFRRadiobuttonControl(this,
SFXRectangle(10, 140, 90, 20),
"radio1");
_radiobutton2 = new SFRRadiobuttonControl(this,
SFXRectangle(105, 140, 90, 20),
"radio2");
// ラジオ ボタンのグループ化
_radiobutton2->Group(_radiobutton1);
// radiobutton1 を選択状態にする
_radiobutton1->SetStatusCheck(true);
// コンボ ボックスの作成
SFXWideString item[] = {"item1", "item2", "item3"};
_combobox = new SFRComboboxControl(this,
SFXRectangle(10, 165, 90, 20),
item,
lengthof(item));
// *** 太字が追加部分
// コンボ ボックス の項目が選択されたときのハンドラの登録
if (static_try()) {
static_throw(
_combobox->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnComboboxControl)));
}
}
コントロールは、選択できないように無効にしたり、非表示にできます。
button4 を押したときにコントロールを無効 / 非表示 にします。
例 3.30. ボタン button4 のハンドラの宣言
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
// *** 太字が追加部分
private:
// ポインター型のメンバ変数として定義する
SFRCheckboxControlPtr _checkbox1;
SFRCheckboxControlPtr _checkbox2;
SFRRadiobuttonControlPtr _radiobutton1;
SFRRadiobuttonControlPtr _radiobutton2;
SFRComboboxControlPtr _combobox;
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl4)
};
例 3.31. ボタン button4 のハンドラの登録
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
// button3 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button3->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl3)));
}
// *** 太字が追加部分
// button4 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button4->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl4)));
}
// チェック ボックスの作成
_checkbox1 = new SFRCheckboxControl(this,
SFXRectangle(10, 115, 90, 20),
"check1");
_checkbox2 = new SFRCheckboxControl(this,
SFXRectangle(105, 115, 90, 20),
"check2");
// ラジオ ボタンの作成
_radiobutton1 = new SFRRadiobuttonControl(this,
SFXRectangle(10, 140, 90, 20),
"radio1");
_radiobutton2 = new SFRRadiobuttonControl(this,
SFXRectangle(105, 140, 90, 20),
"radio2");
// ラジオ ボタンのグループ化
_radiobutton2->Group(_radiobutton1);
// radiobutton1 を選択状態にする
_radiobutton1->SetStatusCheck(true);
// コンボ ボックスの作成
SFXWideString item[] = {"item1", "item2", "item3"};
_combobox = new SFRComboboxControl(this,
SFXRectangle(10, 165, 90, 20),
item,
lengthof(item));
// コンボ ボックス の項目が選択されたときのハンドラの登録
if (static_try()) {
static_throw(
_combobox->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnComboboxControl)));
}
}
ボタンハンドラの定義でコントロールを無効 / 非表示にします。
例 3.32. ボタン4 のハンドラの実装
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) {
// チェック ボックス 2 を無効にする
_checkbox2->SetStatusEnable(false);
// ラジオ ボタン 1 を無効にする
_radiobutton1->SetStatusEnable(false);
// ラジオ ボタン 2 を非表示にする
_radiobutton2->SetStatusVisible(false);
}
ウィンドウ全体を無効にできます。
例 3.33. ウィンドウ全体を無効にするコード
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) {
// チェック ボックス 2 を無効にする
_checkbox2->SetStatusEnable(false);
// ラジオ ボタン1を無効にする
_radiobutton1->SetStatusEnable(false);
// ラジオ ボタン2を非表示にする
_radiobutton2->SetStatusVisible(false);
// ↓以下を追加
// ウィンドウ全体を無効にする
this->SetStatusEnable(false);
}
図のようにテキスト ボックスを配置するコードを追加します。
例 3.34. テキスト ボックスの定義とそのハンドラの宣言
SFMTYPEDEFCLASS(MyWindow)
class MyWindow : public SFRTitleWindow {
SFMSEALCOPY(MyWindow)
public:
MyWindow(Void) static_throws;
virtual ~MyWindow(Void);
// *** 太字が追加部分
private:
// ポインター型のメンバ変数として定義する
SFRCheckboxControlPtr _checkbox1;
SFRCheckboxControlPtr _checkbox2;
SFRRadiobuttonControlPtr _radiobutton1;
SFRRadiobuttonControlPtr _radiobutton2;
SFRComboboxControlPtr _combobox;
SFREditboxControlPtr _editbox;
HANDLER_DECLARE_VOIDRENDER(OnRenderContent)
HANDLER_DECLARE_BOOLEVENT(OnKey)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl1)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl2)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl3)
HANDLER_DECLARE_VOIDCONTROL(OnButtonControl4)
HANDLER_DECLARE_VOIDCONTROL(OnEditboxControl)
};
例 3.35. テキスト ボックスの作成とそのハンドラの登録
MyWindow::MyWindow(Void) : SFRTitleWindow(SFRApplication::GetInstance(),
SFXRectangle(20, 20, 200, 250), "my window") static_throws
{
// 描画ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SREVT_RESPONDER_RENDER,
SRP16_RENDER_CONTENT,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnRenderContent)));
}
// キー ハンドラの登録
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
HANDLER_AFTER,
HANDLER_FUNCTION(OnKey)));
}
// ボタンの作成
SFRButtonControlPtr button1 = new SFRButtonControl(this,
SFXRectangle(10, 10, 50, 25),
"b1");
SFRButtonControlPtr button2 = new SFRButtonControl(this,
SFXRectangle(10, 45, 50, 25),
"b2");
SFRButtonControlPtr button3 = new SFRButtonControl(this,
SFXRectangle(10, 80, 50, 25),
"b3");
SFRButtonControlPtr button4 = new SFRButtonControl(this,
SFXRectangle(70, 10, 50, 25),
"b4");
SFRButtonControlPtr button5 = new SFRButtonControl(this,
SFXRectangle(70, 45, 50, 25),
"b5");
// button1 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button1->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl1)));
}
// button2 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button2->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl2)));
}
// button3 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button3->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl3)));
}
// button4 を押したときのハンドラの登録
if (static_try()) {
static_throw(
button4->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnButtonControl4)));
}
// チェック ボックスの作成
_checkbox1 = new SFRCheckboxControl(this,
SFXRectangle(10, 115, 90, 20),
"check1");
_checkbox2 = new SFRCheckboxControl(this,
SFXRectangle(105, 115, 90, 20),
"check2");
// ラジオ ボタンの作成
_radiobutton1 = new SFRRadiobuttonControl(this,
SFXRectangle(10, 140, 90, 20),
"radio1");
_radiobutton2 = new SFRRadiobuttonControl(this,
SFXRectangle(105, 140, 90, 20),
"radio2");
// ラジオ ボタンのグループ化
_radiobutton2->Group(_radiobutton1);
// radiobutton1 を選択状態にする
_radiobutton1->SetStatusCheck(true);
// コンボ ボックスの作成
SFXWideString item[] = {"item1",
"item2",
"item3"};
_combobox = new SFRComboboxControl(this,
SFXRectangle(10, 165, 90, 20),
item,
lengthof(item));
// コンボ ボックス の項目が選択されたときのハンドラの登録
if (static_try()) {
static_throw(
_combobox->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnComboboxControl)));
}
// *** 太字が追加部分
// テキスト ボックスの作成
// 初期値 : "hello textbox"
_editbox = new SFREditboxControl(this,
SFXRectangle(10, 190, 150, 28),
"hello textbox");
// 最大文字数を設定する
_editbox->SetMaxSize(255);
// テキストの入力後やフォーカスが外れたときの
// ハンドラの設定
if (static_try()) {
static_throw(
_editbox->RegisterHandler(SREVT_CONTROL,
HANDLER_BEFORE,
HANDLER_FUNCTION(OnEditboxControl)));
}
// テキスト ボックス上でセレクトキーを押したときに
// 入力モードに移るようにセットする
// ( SelectHandler は SophiaFramework が用意しているセレクトキー用のハンドラ )
if (static_try()) {
static_throw(
RegisterHandler(SFEVT_KEY,
AVK_SELECT,
HANDLER_AFTER,
HANDLER_FUNCTION(SelectHandler)));
}
}
テキスト ボックスに入力されたテキストは GetText() 関数で取得します。
例 3.37. ボタン button3 のハンドラの実装
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl3, result, control)
{
// *** 太字が追加部分
// テキスト ボックスからテキストを取得する
SFXAnsiString string = static_cast<SFXAnsiString>(_editbox->GetText());
// テキストを表示する
TRACE("_editbox: %s", string.GetCString());
}
テキストコントロールに入力された文字列が、デバック画面に表示されます。
|
Copyright (C) 2002 - 2008 Sophia Cradle, Inc. All Rights Reserved. |
![]() ![]() ![]()
|