SophiaFramework UNIVERSE 5.3 |
図のようにボタンを配置するコードを追加します。
例 5.14. ボタンの作成
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 UNIVERSE では、ポインタ型は Ptr で表します。SFRButtonControlPtr は SFRButtonControl* と同じ意味です。 |
セレクトキーでボタンを押します。
キーハンドラにフォーカス移動のコードを追加します。
例 5.15. キーハンドラの実装
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; }
方向キーを押すことでフォーカスの移動が確認できます。
ボタンが押されたときに実行するコードを追加します。
例 5.16. ボタンハンドラの宣言
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)
};
例 5.17. ボタンハンドラの実装
// ボタン 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)); }
例 5.18. ボタンハンドラの登録
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))); } }
図のようにチェックボックスを配置するコードを追加します。
例 5.19. チェックボックスの定義
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) };
例 5.20. チェックボックスの作成
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 を押すと、チェックボックスの状態を取得するコードを追加します。
例 5.21. ボタン 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 を押すと チェックボックスの状態を取得します。
例 5.22. ボタン 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"); } }
例 5.23. ボタン 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"); }
図のようにラジオボタンを配置するコードを追加します。
例 5.24. ラジオボタンの定義
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) };
例 5.25. ラジオボタンの作成
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 関数で状態取得できます。 |
図のようにコンボボックスを配置するコードを追加します。
例 5.26. コンボボックスの定義
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) };
例 5.27. コンボボックスの作成
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)); }
コンボボックスでは、項目が選択されたときに実行されるハンドラを登録できます。
例 5.28. コンボボックスハンドラの宣言
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) };
例 5.29. コンボボックスのハンドラの実装
// 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()); } }
例 5.30. コンボボックスのハンドラの登録
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 を押したときにコントロールを無効 / 非表示 にします。
例 5.31. ボタン 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) };
例 5.32. ボタン 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))); } }
ボタンハンドラの定義でコントロールを無効 / 非表示にします。
例 5.33. ボタン4 のハンドラの実装
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) { // チェックボックス 2 を無効にする _checkbox2->SetStatusEnable(false); // ラジオボタン 1 を無効にする _radiobutton1->SetStatusEnable(false); // ラジオボタン 2 を非表示にする _radiobutton2->SetStatusVisible(false); }
ウィンドウ全体を無効にできます。
例 5.34. ウィンドウ全体を無効にするコード
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl4, result, control) { // チェックボックス 2 を無効にする _checkbox2->SetStatusEnable(false); // ラジオボタン1を無効にする _radiobutton1->SetStatusEnable(false); // ラジオボタン2を非表示にする _radiobutton2->SetStatusVisible(false); // ↓以下を追加 // ウィンドウ全体を無効にする this->SetStatusEnable(false); }
図のようにテキストボックスを配置するコードを追加します。
例 5.35. テキストボックスの定義とそのハンドラの宣言
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) };
例 5.36. テキストボックスの作成とそのハンドラの登録
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 UNIVERSE が用意しているセレクトキー用のハンドラ ) if (static_try()) { static_throw( RegisterHandler(SFEVT_KEY, AVK_SELECT, HANDLER_AFTER, HANDLER_FUNCTION(SelectHandler))); } }
テキストボックスに入力されたテキストは GetText 関数で取得します。
例 5.38. ボタン button3 のハンドラの実装
HANDLER_IMPLEMENT_VOIDCONTROL(MyWindow, OnButtonControl3, result, control) { // *** 太字が追加部分 // テキストボックスからテキストを取得する SFXAnsiString string = static_cast<SFXAnsiString>(_editbox->GetText()); // テキストを表示する TRACE("_editbox: %s", string.GetCString()); }
テキストコントロールに入力された文字列が、デバック画面に表示されます。
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |