2023年06月10日くいなちゃん


プログラミング言語Kuin」の実行環境がexe用の逆引き辞典9、ウインドウとコントロールの扱い方についてです。

ウインドウを扱う

ダイアログボックスを表示する

コントロールを扱う

エディットボックスコントロールを扱う

目次

1ウインドウを扱う

1.1ウインドウをプログラム上で作成する



ウインドウをプログラム上で作成するには「wnd@makeWnd(親ウインドウ, ウインドウスタイル, , 高さ, タイトル)」とします(図1-1)。
  1. var wndMain: wnd@Wnd
  2.  
  3. func main()
  4.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  5.  
  6.   while(wnd@act())
  7.   end while
  8. end func
図1-1: ウインドウのプログラム上での作成
第2引数のウインドウスタイルには、「%normal」を指定するとサイズ変更や最大化や最小化ができる一般的なウインドウになります。 「%fix」はサイズ変更も最大化も最小化もできない固定ウインドウになります。 「%aspect」はアスペクト比を維持するウインドウで、ゲームを制作するときに使います。
6行目の「wnd@act」関数は、ウインドウを移動させる処理など、ウインドウに関わる様々な処理を行うため定期的に呼び出す必要があります。 呼び出さない間はウインドウが「応答なし」になります。 ウインドウが閉じられるとfalseが返るため、直ちにプログラムを終了します。
実行すると図1-2のようになります。
ウインドウ
図1-2: ウインドウ

1.2ウインドウを視覚的に配置して作成する



(この記事は執筆中です!)

2ダイアログボックスを表示する

2.1メッセージボックスを表示する



メッセージボックスとは図2-1のような、メッセージを表示してユーザに確認を求めることができるダイアログボックスです。
メッセージボックス
図2-1: メッセージボックス
メッセージボックスを表示するには、「wnd@msgBox(親ウインドウ, メッセージ, タイトル, アイコン, ボタン)」とします(図2-2)。
  1. func main()
  2.   var result: wnd@MsgBoxResult :: wnd@msgBox(null, "プログラムを終了しますか?", "確認", %warn, %yesNoCancel)
  3. end func
図2-2: メッセージボックスの表示
第4引数のアイコンは、「%none」でアイコンなし、「%info」で情報を表す「i」アイコン、「%question」で質問を表す「?」アイコン、「%warn」で警告を表す「!」アイコン、「%err」でエラーを表す「×」アイコンです。
第5引数のボタンは、「%ok」で「[OK]」、「%okCancel」で「[OK][キャンセル]」、「%yesNo」で「[はい][いいえ]」、「%yesNoCancel」で「[はい][いいえ][キャンセル]」などがあります。
ユーザが押したボタンは戻り値として取得でき、「%ok」なら「[OK]」、「%cancel」なら「[キャンセル]」または右上の「×」ボタン、「%yes」なら「[はい]」、「%no」なら「[いいえ]」ボタンが選ばれたことを表します。

2.2インプットボックスを表示する



インプットボックスとは図2-3のような、ユーザに文字列を入力させるダイアログボックスです。
インプットボックス
図2-3: インプットボックス
インプットボックスを表示するには、「wndex@inputBox(親ウインドウ, メッセージ, タイトル, 初期値, 検証関数)」とします(図2-4)。
  1. func main()
  2.   var result: []char :: wndex@inputBox(null, "あなたの名前を入力してください。", "確認", "Kuina", null)
  3. end func
図2-4: インプットボックスの表示
ユーザが入力した文字列が戻り値で返ります。 キャンセルボタンまたは右上の「×」ボタンが押された場合にはnullが返ります。
第5引数にコールバック関数を指定すると、入力が一定の形式に沿うまで確定できないようにできます(図2-5)。
  1. func main()
  2.   var result: []char :: wndex@inputBox(null, "1桁の整数を入力してください。", "確認", null, validate)
  3.  
  4.   func validate(value: []char): bool
  5.     var success: bool
  6.     var intValue: int :: value.toInt(&success)
  7.     if(!success)
  8.       ret false {整数に変換できないなら確定させない}
  9.     end if
  10.     if(intValue < 0 | 9 < intValue)
  11.       ret false {0以上9以下の範囲外なら確定させない}
  12.     end if
  13.     ret true {確定させる}
  14.   end func
  15. end func
図2-5: インプットボックスの検証関数

2.3ファイルを開くダイアログを表示する



ファイルを開くダイアログとは図2-6のような、ユーザに開くファイルを指定させるダイアログボックスです。
ファイルを開くダイアログ
図2-6: ファイルを開くダイアログ
ファイルを開くダイアログを表示するには、「wnd@openFileDialog(親ウインドウ, フィルター, 最初に選択されるフィルターの番号)」とします(図2-7)。
  1. func main()
  2.   var path: []char :: wnd@openFileDialog(null, ["画像ファイル(*.png,*.jpg)", "*.png;*.jpg", "すべてのファイル", "*.*"], 0)
  3. end func
図2-7: ファイルを開くダイアログの表示
フィルターは、指定した拡張子のファイルのみを一覧させることができ、「[表示テキスト0,拡張子0,表示テキスト1,拡張子1,表示テキスト2,拡張子2,...]」と2つ1組で並べます。 拡張子は「;」で区切って、「"*.拡張子;*.拡張子;*.拡張子;..."」の形で複数指定できます。
選択されたファイルのフルパスが返ります。 キャンセルされた場合にはnullが返ります。
最初に表示されるディレクトリを設定するには、事前に「wnd@fileDialogDir(ディレクトリパス)」を呼び出しておきます。 デフォルトでは「wnd@fileDialogDir(null)」が設定されていて、最初に表示されるディレクトリはOSに任せられます。

2.4名前を付けて保存ダイアログを表示する



名前を付けて保存ダイアログとは図2-8のような、ユーザに保存するファイルを指定させるダイアログボックスです。
名前を付けて保存ダイアログ
図2-8: 名前を付けて保存ダイアログ
名前を付けて保存ダイアログを表示するには、「wnd@saveFileDialog(親ウインドウ, フィルター, 最初に選択されるフィルターの番号, 拡張子が省略されたときに自動で付ける拡張子)」とします(図2-9)。
  1. func main()
  2.   var path: []char :: wnd@saveFileDialog(null, ["画像ファイル(*.png,*.jpg)", "*.png;*.jpg", "すべてのファイル", "*.*"], 0, "png")
  3. end func
図2-9: 名前を付けて保存ダイアログの表示
フィルターおよび戻り値は、wnd@openFileDialogと同様です。

3コントロールを扱う

ここでは、最も単純なコントロールであるプッシュボタンを例に、各コントロールで共通する扱い方を示します。

3.1コントロールを作成する



プッシュボタンコントロールを作成するには「wnd@makeBtn(親ウインドウ, 左端座標, 上端座標, , 高さ, 横方向のアンカー, 縦方向のアンカー, プッシュボタン表面に表示するテキスト)」とします(図3-1)。
  1. var wndMain: wnd@Wnd
  2. var btnHello: wnd@Btn
  3.  
  4. func main()
  5.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  6.   do @btnHello :: wnd@makeBtn(@wndMain, 12, 12, 185, 23, %fix, %fix, "Push Me")
  7.   do @btnHello.onPush :: btnHelloOnPush
  8.  
  9.   while(wnd@act())
  10.   end while
  11.  
  12.   func btnHelloOnPush(wnd: wnd@WndBase)
  13.     do wnd@msgBox(@wndMain, "Hello!", "Message", %none, %ok)
  14.   end func
  15. end func
図3-1: プッシュボタンコントロールの作成
7行目のように「.onPush」に関数を代入しておくと、プッシュボタンが押されるたびにその関数が呼ばれます。 関数は「func 関数名(wnd: wnd@Btn)」の形で定義します。
実行してプッシュボタンを押すと、図3-2のようになります。
プッシュボタンコントロール
図3-2: プッシュボタンコントロール
wnd@makeBtn関数の引数にある「アンカー」とは、親ウインドウのサイズが変わったときの振る舞いのことです。 「%fix」はサイズを常に固定し、「%move」は親ウインドウの拡縮に伴って移動し、「%scale」は親ウインドウに合わせて拡縮します(図3-3)。
アンカー
図3-3: アンカー
このアンカーはプッシュボタンコントロールに限らず、すべてのコントロールで同様です。

3.2コントロールを無効化や非表示にする



コントロールが操作できる状態かどうかを設定するには、「.setEnabled(操作できるならtrue、できないならfalse)」とします。 例えばプッシュボタンコントロールを「.setEnabled(false)」にすると、灰色の表示になってユーザはボタンが押せなくなります(図3-4)。
  1. var wndMain: wnd@Wnd
  2. var btnHello: wnd@Btn
  3.  
  4. func main()
  5.   do @wndMain :: wnd@makeWnd(null, %normal, 800, 450, "Title")
  6.   do @btnHello :: wnd@makeBtn(@wndMain, 12, 12, 185, 23, %fix, %fix, "Push Me")
  7.   do @btnHello.setEnabled(false) {無効化}
  8.   var enabled: bool :: @btnHello.getEnabled() {false}
  9.   do @btnHello.setVisible(false) {非表示}
  10.   var visible: bool :: @btnHello.getVisible() {false}
  11.  
  12.   while(wnd@act())
  13.   end while
  14. end func
図3-4: コントロールの無効化と非表示
8行目のように、「.getEnabled()」で操作できる状態かどうかを取得できます。
また同様に、表示するかどうかを設定するには9行目のように「.setVisible(表示するならtrue、しないならfalse」とします。 10行目のように「.getVisible()」で表示されているかどうかを取得できます。
これらのメソッドはすべてのコントロールと、ウインドウにも設定できます。 コントロールやウインドウに「.setEnabled(false)」や「.setVisible(false)」をすると、その子コントロールや子ウインドウがすべて操作できなくなったり非表示になったりします。

4エディットボックスコントロールを扱う

(この記事は執筆中です!)
1686380831jaf