Windowsのアプリケーションでよく使われるメニューバーが利用できます。
画面最上段に横方向の帯としてメニューバーを設置できます。
メニューバーの中には横方向にメニューボタンが並びます。
・−−−−−−−−−−−−−−−−−−−−−−−−−−・
||ボタン1|ボタン2|・・・・・|ボタンN| |
・−−−−−−−−−−−−−−−−−−−−−−−−−−・
| |
| |
| |
| |
| |
| |
・−−−−−−−−−−−−−−−−−−−−−−−−−−・
メニューボタンを押したとき、ボタンウィジェットと同様にイベントを発生できますが、ボタンを押すとさらにサブメニューを表示する(この場合はイベントは発生しない)ことも出来ます。サブメニューの中でさらにサブメニューを出すことも可能です。
■メニューバーのIDの取得と有効化
構文=
<ウィンドウID>で メニューバーのIDを取得 → メニューID
<メニューID>を 有効化する → ・
プログラム例:
○○とは
メニューバーは ID
メインウィンドウで メニューバーのIDを取得し
メニューバーに 入れ
メニューバーを 有効化する
↑これで表示されるので「配置」は不要
親となるウィンドウのIDを与えてメニューバーのIDを取得します。通常は上の例のように直ちに有効化します。
他のウィジェットと異なり、メニューバーは有効化時に自動的に配置されるので、明に配置をおこなう必要はありません。
(記:厳密に言えば、単に 有効化 だけではメニューバーは現れず、後続してメニューボタンなどのメニュー項目を追加した段階で画面に現れます)
- 注
-
・「その他の配置手段」−「異なる配置手段の混在」 にて、並べ配置/座標配置/格子配置は混在できない旨の解説をしていますが、メニューバーは配置の概念を超えた存在であるためメニューバー以外のウィジェットとの組み合わせとしてはどの配置形態も使うことができます。
(本章でのサンプルプログラムでは他のウィジェットには並べ配置を使っています)
→ メニューバー以外のウィジェットを配置するにあたって、メニューバーを配置対象として加える必要はありません。
→ 感覚としては、ウィンドウの縦方向がメニューバーの分だけ短くなったようなものと言えます。
■メニュー項目としてボタンを追加
構文=
(ステップ1:ボタンの登録)
<メニューID>と <テキスト>と <実行情報>と <引数>で
メニュー項目としてボタンを追加 → ・
注:<メニューID>の個所には、メニューバーのID
または サブメニューのID を指定します
(ステップ2:イベント発生時に渡されるパラメータ)
↓登録時の引数が空列のときはゼロのみ渡される
スタック→ 0(引数個数)
↓登録時の引数が非空列のとき
スタック→ 引数1,引数2,・・、 n(引数個数)
↑
引数が1個ならn=1
プログラム例:
メニューバーと 「ヘルプ」と ↓注:引数無しの場合は空列を渡す
ヘルプ表示の 実行情報と 「」で
メニュー項目としてボタンを追加し
メニューバーあるいはサブメニューの項目として、指定するテキストを持つボタンを追加します。
追加されたボタンはメニューバー左端から右に向けて (サブメニューの場合は上から下に向けて) 並びます。
メニューバー本体にボタンを追加する場合はメニーバーIDを、サブメニューとしてボタンを追加する場合はサブメニューのIDを指定します。
ボタンが押された時に起動すべき処理単語の実行情報をその引数と共に指定できます。
イベント引数は文字列で、
「abc」を ・・
のように指定します。複数の引数は
「abc def」を ・・
のように空白で区切って並べてください。引数に空白文字を含む場合には
「"ab c" def」を ・・
のように指定してください。
なお、引数(群)文字列末尾に \ 記号は付けられません。また、{ } 記号は使えるものの、開きと閉じでバランスが取れている必要があります。(アンバランスで使うとエラーを検出します)
■メニュー項目として区切りを追加
構文=
<メニューID>で メニュー項目として区切りを追加 → ・
注:<メニューID>の個所には、メニューバーのID
または サブメニューのID を指定します
メニューバーあるいはサブメニューの項目として区切り線を追加します。
区切り線であっても1つの項目として数えます(項目番号があります)。
・メニューバーに対して区切り線を追加した場合
前のメニューボタンと次のメニューボタンの間に隙間ができるだけで、
横線は表示されません。
・サブメニューに対して区切り線を追加した場合
「------」という横線がサブメニュー項目として追加されます。
<<描画時>>
■メニュー項目としてチェックボタンを追加
構文=
<メニューID>と <テキスト>と <初期値>で
メニュー項目としてチェックボタンを追加 → ID
注:<初期値>は真偽を表す整数(0または1)
プログラム例:
昼食必要のチェックIDは ID
夕食必要のチェックIDは ID
サブメニューと
「昼食必要」と 1で ←1はonを表す
メニュー項目としてチェックボタンを追加し
昼食必要のチェックIDに 入れ
サブメニューと
「夕食必要」と 0で ←0はoffを表す
メニュー項目としてチェックボタンを追加し
夕食必要のチェックIDに 入れ
チェックボタンの表示例:
メニュー項目としてチェックボタンを追加します。
初期値で真偽を指定することで描画当初でのON/OFFを指定できます。
IDが返されますがチェック状態の参照のために使うので保存しておきます。
<<参照時>>
チェックボタンを操作したときイベントは発生せず、内部状態の変化と見た目の変化だけが起きます。
チェックボタンの状態を得たい場合には適切なタイミングで(何らかのイベント処理として)次に示す参照用の単語を実行してください。
■チェックボタンの値を参照
構文=
<チェックID>を チェックボタンの値を参照 → 状態文字列
プログラム例:
○○とは
↓ユーザ設置の文字列実体
昼食必要のチェック状態は 文字列実体 長さ 1桁
昼食必要のチェックIDを チェックボタンの値を参照し
昼食必要のチェック状態に 入れ
チェックボタンの現在の状態を得ます。値は"0"または"1"の文字列です。
この文字列はライブラリ内部に設置された文字列実体変数に格納され、そこを示す文字列情報として返されるため、続いて同じ単語を実行すると前回の値が上書きされてしまいます。
したがって得た値を消費しないうちに再度実行する場合はユーザ側で設置した文字列実体変数に退避してください。
<<描画時>>
ラジオボタンの
追加開始の手続きと、それに続く
追加(複数繰り返し)の2段階に分かれます。
■メニュー項目としてラジオボタンを追加開始
構文=
<メニューID>と <オンの番号>で
メニュー項目としてラジオボタンを追加開始 → 参照ID
プログラム例:
○○とは
ごはんの選択参照IDは ID
サブメニューと
2番で ←2番を初期オンにする
メニュー項目としてラジオボタンを追加開始し
ごはんの選択参照IDに 入れ
ラジオボタンの表示例:
一連のラジオボタン群の描画に先立ちこの単語を1度だけ実行します。
初期オンにすべき項目番号(1からの整数)を指定します。
参照IDが返されます。これは状態参照時に使うので整数変数に保存しておいてください。
注: ラジオボタンとチェックボタンのボタン部分が見た目上、同じで区別ができませんが、GUIエンジンの特性でありバグではありません(単独ウィジェットとしてのラジオボタンは本来の表示となります)。
■メニュー項目としてラジオボタンを追加
構文=
<メニューID>と <テキスト>と <値>で
メニュー項目としてラジオボタンを追加 → ・
注:<値>はラジオボタンの選択を参照したとき返す文字列
プログラム例:
サブメニューと
「ごはん大盛り」と
「大」で メニュー項目としてラジオボタンを追加し
サブメニューと
「ごはん普通盛り」と
「中」で メニュー項目としてラジオボタンを追加し
サブメニューと
「ごはん小盛り」と
「小」で メニュー項目としてラジオボタンを追加し
−−−−−−−−−−−−−−
(描画)
( ) ごはん大盛り
(・) ごはん普通盛り ←2番が初期オン
( ) ごはん小盛り
指定したメニューにラジオボタンの項目を一つ追加します。ラジオボタンの数だけ繰り返し記述します。
「値」は状態参照時に「どのボタンがオンか」を識別できるような文字列を指定します。これは表示には使われず、プログラム処理用です。上の例では「大」「中」「小」という文字列を指定していますが文字列であれば何でも構いません。
<<参照時>>
ラジオボタンを操作したときにイベントは発生せず、内部状態の変化と見た目の変化だけが起きます。したがってラジオボタンの状態を得たい場合には適切なタイミングで(何らかのイベント処理として)次に示す参照用の単語を実行してください。
■ラジオボタンの選択を参照
構文=
<チェックID>を ラジオボタンの選択を参照 → 値(文字列)
プログラム例:
↓ラジオボタンの値で一番長いバイト数を指定
ごはんの値は 文字列実体 長さ 2
ごはんの選択参照IDを ラジオボタンの選択を参照し
ごはんの値に 入れ
いま選択されているラジオボタンの選択値を文字列として得ます。返される値は、登録したラジオボタンの
テキスト と
値 のペア のうち
値 のほうです。
この参照値はライブラリ内部に設置された文字列実体変数に格納され、そこを示す文字列情報として返されるため、続いて同じ単語を実行すると前回の値が上書きされてしまいます。もし得た値を消費しないうちに再度実行する場合はユーザ側で設置した文字列実体変数に退避してください。
参照値を変数に格納する場合の文字列実体変数の長さは、ボタン群の一番長い値(文字列)のバイト数を指定してください。先のプログラム例では値が「大」「中」「小」のいずれかなので、長さは2以上にすれば良いことになります。
この先から「
項目番号」という概念が出てきます。
メニューバー、あるいはサブメニューについてはIDが割り当てられていますが、そのメニュー内に設置したボタンやチェックボックスなどの項目にはIDは無く、個々の項目に対して何らかの操作を行う場合は番号(1から数える)で指定することになります。たとえばメニューの先頭項目は1番です。
・区切り線 や サブメニュー項目 も1つの項目番号を持ちます。
・サブメニュー項目 は項目として、そしてサブメニューの親として、の二つの顔を持ちます。前者の用途では項目番号を使い、後者の用途ではIDを使います。
・幾つかの処理単語では0番を指定すると特別な項目指定として扱われます。
サンプルプログラム "menu-detail.exe" を実行してみてください。
メニー項目2をクリックするとサブメニューが表示されますが、項目1と項目2(いずれもボタン)にはショートカットとして Ctrl-c, Ctrl-d が割り当てられているのが分かります。
次に主画面に戻り、Ctrl-c を押してみてください。「項目2のボタン1が押された」というモニタが表示され、項目2のボタン1の押下と同じ効果があることが分かります。
以下ではこのショートカットの設定について説明します。
■バインドの概念
ショートカットはオプションであり、この先で示す処理単語を使って明に指定します。
メニュー項目に設置したショートカットにより特定のキー操作をメニュー項目のいずれかに結び付けることができますが、もう少し広い意味で、
特定のイベントをある処理に結び付ける
ことをバインドと呼びます。メニューバーにおいてはショートカットになりますが、たとえばテキストウィジェットの中でのキー操作(たとえばCtrl-z)に対してMindで書いた特定の処理(アンドゥ処理)を結び付けることもでき、そのような広い意味で結び付けの概念を「バインド」と呼びます。
■この番号のメニュー項目にショートカットを登録
構文=
<メニューID>の <項目番号>に
<キーシンボル>と <対象ウィジェットID>で
この番号のメニュー項目にショートカットを登録 → ・
注:<項目番号>は1から数える整数です
(特別に0を指定すると直前に追加したボタンへの
登録であると解釈されます)
注:<キーシンボル>はキーを指定する文字列です
(詳しくは キーシンボルによるイベント名 に)
注:<対象ウィジェットID>はこのショートカットが
効果を持つ対象となるウィジェットを示します
多くの場合、ウィンドウIDです
プログラム例:
項目2のサブメニューは ID
項目2のサブメニューの 1番に
「Ctrl-c」と メインウィンドウで
この番号のメニュー項目にショートカットを登録する
項目番号として0(ゼロ)を指定すると、直近のメニューボタン追加に対する項目と解釈されます。
もし 「メニュー項目としてボタンを追加」 の直後、同項目に対してショートカットも併せて登録するのであれば、わざわざ項目番号を調べなくても、0を指定することで代用できます。
プログラム例:(項目番号=0の利用例)
項目2のサブメニューは ID
(メニューボタンを追加)
項目2のサブメニューと 「ヘルプ」と
ヘルプ表示の 実行情報と 「」で
メニュー項目としてボタンを追加し
(同、ショートカット) ↓0番を指定
項目2のサブメニューの 0番に
「Ctrl-h」と メインウィンドウで
この番号のメニュー項目にショートカットを登録し
(メニューボタンを追加)
項目2のサブメニューと 「・・・」と
・・・・・・・・・・・・ 「」で
メニュー項目としてボタンを追加し
(同、ショートカット) ↓0番を指定
・・・・・・・・・・・
・・・・・・・・・・・
注:「メニュー項目としてボタンを追加」の直後でない
個所で0番指定をおこなうと予期しない動作になったり
エラー検出することがありますので注意してください
■この番号のメニュー項目にショートカットを表示
構文=
<メニューID>の <項目番号>に
<キーシンボル>と <対象ウィジェットID>で
この番号のメニュー項目にショートカットを表示 → ・
↑ここの綴りが違う
注:構文は「この番号のメニュー項目にショートカットを登録」と
ほぼ同じなのでそちらの注釈も参照願います。
「この番号のメニュー項目にショートカットを登録」にそっくりですが、ショートカットの対応が異なり、こちらではメニューに表示はするものの、バインドは行いません。
サンプルプログラム "text-edit.exe" を起動してみてください。たとえば、メニューの「編集」を押すと 「切り取り」 に Ctrl-x というショートカットが割付られているのが見えます。
しかし、Ctrl-x 打鍵での切り取り操作はテキストウィジェットのデフォルト動作であるためバインドする必要がありません。(バインド登録しなくてもCtrl-x 打鍵で切り取りが行われます)
しかし、見た目としてはショートカットが登録されているかのような動作をするので、そのことは利用者に知らせる必要があります。つまり「メニュー表示上だけショートカットが存在するように見せるがバインドはおこなわない」・・という機能になります。
キーシンボルとはキーボードのキー1つ1つを表すシンボルです。
"c" とか "[" といったキーの刻印そのものに対応した1文字の文字列のほか、"Enter", "Esc" のような機能キーもあり、さらには "Ctrl-c" のように、Ctrlキー、Shiftキー、Altキー併用での打鍵を意味する書き方もあります。
キーシンボルの表記にはルールがあります。
バインドとイベント名 に詳しい解説がありますので参照願います。
一度表示したメニュー項目を抑制/活性したり削除するといった操作を行うことができます。
■この番号のメニュー項目を抑制/活性
構文=
<メニューID>の <項目番号>を この番号のメニュー項目を抑制
<メニューID>の <項目番号>を この番号のメニュー項目を活性
プログラム例:
項目2のメニュー記憶と 1番で この番号のメニュー項目を抑制し
メニューIDと項目番号で指定した項目を抑制したり、活性(元に戻す)することができます。
抑制した場合、その項目表示は薄字となりを押しても無反応となります。ショートカットも無視されます。
■この番号のメニュー項目を削除
構文=
<メニューID>の <項目番号>を この番号のメニュー項目を削除
プログラム例:
項目2のメニュー記憶と 1番で この番号のメニュー項目を削除し
メニューIDと項目番号で指定した項目を削除します。
項目にショートカットが割り当てられている場合、その割り当ても解除されます。
項目を削除すると、それより先にある項目群は前方に詰められ、各項目の番号も1つずつ小さくなることに注意してください。
たとえば、この処理単語を続けて実行し、
(誤)
2番の項目を削除
3番の項目を削除
をしようとしても正しく動作しません。なぜなら、2番の項目の削除によって元の3番が2番になっているため、「3番の項目を削除」をおこなうと元の4番が削除されてしまうからです。
正しい書き方は、
(正)
(後述するがもっと良い方法がある)
2番の項目を削除
2番の項目を削除
となるのですが、これではまぎらわしいため、次に示す 「
この範囲の番号のメニュー項目を削除」 を使うほうがスマートです。
なお区切り線も1つの項目であるため、削除するときはこれも項目番号として数えてください。
■この範囲の番号のメニュー項目を削除
構文=
<メニューID>を
<開始番号>と <終了番号>で
この範囲の番号のメニュー項目を削除する → ・
注:終了番号に0を指定すると末尾項の意味になります
プログラム例:
項目2のメニュー記憶を
2番から 3番まで
この範囲の番号のメニュー項目を削除する
指定した項目範囲のメニュー項目を削除します。後方にある項目群は前方に詰められ、新しく番号が振られます。
■メニューバー自体の削除
メニューバーを削除したい場合はメニューバーのIDを指定して「ウィジェットを削除」を使ってください。
サブメニュー(サブメニューの起点および子)を削除したい場合は、そのサブメニューの項目番号で「この番号のメニュー項目を削除」を使ってください。(サブメニュー下の全項目を削除する方法では子が消えるだけでサブメニュー起点は消えません)
いずれの場合も、削除したメニューに関連するすべてのショートカット割り当ては解除されます。
■最後のメニュー項目番号を得る
構文=
<メニューID>の 最後のメニュー項目番号を得る → 項目番号
指定したメニューに含まれる総項目数を参照できます。
メニューに最後に追加した項目番号を得る目的でも利用できます。
- menu-simple.src/.exe
- メニュー、サブメニュー、チェックボタン、ラジオボタンの表示例
- menu-detail.src/.exe
- 上記に加え、ショートカットが使え、メニュー項目の抑制・活性・削除などをおこなえます
-----------
注: ラジオボタンとチェックボタンのボタン部分が見た目上、同じで区別ができませんが、GUIエンジンの特性でありバグではありません(単独ウィジェットとしてのラジオボタンは本来の表示となります)。