27
 ウィンドウ操作 





 
 
タイトルバーとアイコンの概要
 
 

■アプリケーションが起動したときのウィンドウタイトル
 明に指定しない場合、メインウィンドウおよび子ウィンドウのタイトルバーには、アプリケーションの主ファイル名が自動的に表示されます。
 たとえばソースファイルが "hellowin.src" なら「hellowin」がタイトルバーに表示されます。

■アプリケーションが起動したときのアイコン

<<エクスプローラでファイル一覧を表示し.exeファイルに付くもの>>

 アプリケーションの.exeファイルについて説明します。アプリケーションをコンパイルした時、自動的に次のようなファイル複製が行われています。
                単なるファイル複写
    bin\mindexw.exe   →   <MYAPP>.exe   ()
 したがって、bin\mindexw.exe に元々埋め込まれているアイコン(Mindの標準アイコン)が <MYAPP>.exe にも入ることになります。MindでGUIライブラリリンクでコンパイルしたすべてのアプリケーションは同じアイコンが付与されます。
 もし <MYAPP>.exe のアイコンを独自にしたい場合は以下の方法をとってください。
 方法1:
・初回コンパイルのあと、生成された <MYAPP>.exe のアイコンをアイコン作成ツールなどを使って変更してください
・そのまま再コンパイルすると、mindexw.exe が再度複製され、元に戻ってしまうので、再コンパイルでは -x オプションを指示して mindexw.exe の複製を抑制してください
 方法2:(こちらを推奨)
・あらかじめ、手動にて mindexw.exe の複製をとり、そのアプリケーション専用として保存し、それに対してツールでアイコンを設定してください。(仮に、MYmindexw.exe とします)
・コンパイル時に、 -e:MYmindexw.exe というコンパイルオプションを指定します。指定したファイルをキック用プログラムとするものです。これを mindexw.exe の代わりに使うことになり、アプリケーション専用アイコンが付与されます。
<<タイトルバー左端にあるアイコン>>
 明に指定しない場合、タイトルバーに表示されるアイコンはアプリケーションのexeファイル(ソースが hellowin.src なら hellowin.exe)のアイコンが自動的に表示されます。

■子ウィンドウを開いた時のタイトルとアイコン
 「ウィンドウを開く」により子ウィンドウを開いた場合、タイトルは空欄です。しかしプログラムで設定できます。
 一方でアイコンはメインウィンドウのアイコンと同じになります。こちらもプログラムで設定できます。
 ダイアログについてはダイアログの解説をお読みください。


 
 
ウィンドウID
 
 

 主ウィンドウ、そこから派生する子ウィンドウもウィジェットの一種であり、IDが割り当てられます。これを「ウィンドウID」と呼びます。
 アプリケーションが起動したとき(「メイン」に入った時)、既に主ウィンドウが確保され、IDが確定しています。そのIDは「メインウィンドウ」と書くことで参照できます。
    (例1)
    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
          ↓主ウィンドウのID
    ○○を メインウィンドウに ・・・する
     ↓主ウィンドウのID
    メインウィンドウを ・・・する
    \__________________/
 一方、子ウィンドウを開くには処理単語 「ウィンドウのIDを取得」 によりIDを取得し、以後、そのIDを使って子ウィンドウの操作を行います。
    (例2)
    / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
         子ウィンドウ1は ID
    メインウィンドウで ウィンドウのIDを取得し 子ウィンドウ1に 入れ
    ○○を 子ウィンドウ1に ・・・する
    子ウィンドウ1を ・・・する
    \__________________/


 
 
メインウィンドウの有効化
 
 

 一般的にウィンドウを開くにはウィンドウIDの取得と有効化が必要です。
 しかしメインウィンドウは例外的に「メインとは」の実行に入った段階でウィンドウIDは自動取得され、有効化までおこなわれています。つまり、「メイン」に入ったとき既にメインウィンドウは開いています。
 したがって、背景色の設定やウィンドウ位置やサイズの設定などウィンドウに関する属性指定は有効化後の手続きとなるため、メインウィンドウについては属性設定のあと「変更を反映」を必ず行う必要があります。
 一方で、子ウィンドウを開くときは、たとえば 背景色の設定 は有効化の前であっても後であっても可能です。後者では「変更を反映」を後続してください。


 
 
ウィンドウの背景色
 
 

 ウィジェットの解説で「背景色を設定」というものがありましたが、ウィンドウIDにも適用できます。

構文=
<色指定>を <ウィンドウID>に 背景色を設定 → ・
       プログラム例:
薄い灰色を メインウィンドウに 背景色を設定し
 <ウィンドウID>がメインウィンドウの場合は(プログラム起動時に既に有効化されているため)上記のあと「変更を反映」を行ってください。


 
 
ウィンドウタイトルとアイコン
 
 

■ウィンドウタイトルの変更
 ウィンドウのタイトルバーに表示されるタイトルは、初期状態は既に述べたとおりですが、ユーザが変更することができます。

構文=
<文字列>を <ウィンドウID>に ウィンドウタイトルを変更 → ・         注:ウィンドウが開いた状態でのみ使えます
       プログラム例: window-change-title-and-icon.src (実際に起動してみてください)
「新しいタイトル」を メインウィンドウに ウィンドウタイトルを変更する
 ウィンドウタイトルの変更は属性変更の範疇ではありますが、例外的に即時反映のため「変更を反映」は必要ありません

■タイトルバーに表示されるアイコンの変更
 タイトルバー および ウィンドウ最小化時 のタスクバーに表示されるアイコンの初期状態は冒頭の タイトルバーとアイコンの概要 に書いたとおりですが、ユーザが変更できます。

構文=
<アイコンファイル名>を <ウィンドウID>に ウィンドウアイコンを変更 → ・         注:ウィンドウが開いた状態でのみ使えます
       プログラム例: window-change-title-and-icon.src より (実際に起動してみてください)
"image\AppRun.ico"を メインウィンドウに ウィンドウアイコンを変更する
注:
本機能によってアイコンを変更したとしても、エクスプローラでファイル一覧を表示した際の .exe ファイルアイコンは変わりません。
 <アイコンファイル名>ですが、Windowsでの標準的な拡張子 .ico が使えるのはもちろんのこと、他のアプリケーションの .exe ファイルも指定できます。
 他のアプリケーションの .exeファイルを指定した場合は、当該ファイル先頭に埋め込まれているアイコン情報が抽出されて使用されます。(本GUIライブラリ自身も、これを利用してアプリのアイコンを自動設定しています)
 ウィンドウアイコンの変更は属性変更の範疇ではありますが、例外的に即時反映のため「変更を反映」は必要ありません


 
 
ウィンドウのサイズと位置
 
 

■ウィンドウサイズについて
 明に指定しない限り、「メイン」の初期描画でウィジェット群が描画された後、それらウィジェットをぎりぎり収容するようなウィンドウサイズに詰められます。ぎりぎりではあるものの、必ず全ウィジェットが表示されます。
 ぎりぎりのウィンドウサイズが問題になるとしたら以下のような点でしょう。
     ・見た目が窮屈
     ・ウィンドウの幅が狭いとタイトル文字列(デフォルトではプログラム名)が見えない
 テストプログラムはともかくとしても、実用プログラムでは”ぎりぎりの表示”では窮屈に感じるかもしれません。以下の方法で表示に余裕を持たせることができます。
  (1) ウィジェットの配置時にパディングを指定する(推奨)
サンプル "padding-for-pack.src" がおこなっている方法です。配置IDに対して「パディングを設定」、「パディングの幅を設定」、「パディングの高さを設定」 を指定することで、ウィジェットの外側に余裕ができ、結果的にウィンドウが大きくなります。
  (2) ウィンドウサイズを指定する
次に解説しますが、小さすぎるサイズを指定しないよう注意が必要です。

■ウィンドウサイズを設定

構文=
<幅>と <高さ>を     <ウィンドウID>に ウィンドウサイズを設定 → ・ <幅>と <高さ>を     <ウィンドウID>に 親からの相対でウィンドウサイズを設定 → ・        注:ウィンドウが開いた状態でのみ使えます。          本単語を実行したあと「変更を反映」が          必要です。        注:位置は絶対値以外に、ディスプレイサイズに対す          る比率も使えます。0.0超〜1.0までの小数形式を          使ってください。小数形式であれば自動的に比率          指定と判断されます。たとえば 0.5 0.5 を指定し          た場合は、ウィンドウサイズの幅と高さはディスプ          レイサイズの2分の1の値となります。        注:「親からの相対で・・」のタイプは比率(小数)          のみ指定可能です。絶対値は指定できません。
       プログラム例:
↓絶対サイズ
200,300を メインウィンドウに ウィンドウサイズを設定

↓画面サイズ比率で指定
0.5,0.5を メインウィンドウに ウィンドウサイズを設定

↓親サイズとの比率で指定
0.5,0.5を 子ウィンドウに 親からの相対でウィンドウサイズを設定

       注:サンプルプログラム:
         window-size-setting.src
         window-size-setting-bad.src
         も併せてご覧ください。
 ウィンドウが開いた状態でのみ使えます。本処理単語を実行したあとは必ず、
    <ウィンドウID>を 変更を反映
とすることで変更を反映してください。
 さらには、確実にサイズ変更が行われたあとに後続のウィジェット描画をおこないたいのなら、
    <ウィンドウID>を 変更を反映し
    すべてのイベントを処理し
 のような2語を実行してください。
 狭いウィンドウサイズを指定した場合、ウィジェット群の描画のためのスペースが足りなくなることもあります。あるいは当初は良くてもその後、ウィジェットを増やしたり文字数が増えた場合にスペースが足りなくなるかもしれません。そのような時、ウィジェットが切れて表示されることがあるので注意してください。(サイズを明示した場合はウィンドウが自動拡張されることはありません)
 サンプルプログラム window-size-setting.src は正しく表示できる場合で、window-size-setting-bad.src はウィンドウサイズが狭すぎてウィジェットが切れてしまった場合です。
 「親からの相対でウィンドウサイズを設定」 で注意があります。
 注意の一つは、サイズとして小数(比率)のみが指定可能な点です。整数は指定できません。親のウィンドウとのサイズ比率として計算されることに注意してください。
 サイズとして 1.0, 1.0 を指定した場合、子ウィンドウは親ウィンドウと同じサイズになります。 サイズとして 0.5, 0.5 を指定すれば子ウィンドウのサイズは親ウィンドウの縦横半分のサイズとなります。
 もう一つの注意は「メイン」の処理中で(何かのイベント発生を待たずに強制的に)子ウィンドウを開く場合です。この場合、子ウィンドウを開き始めるタイミングではまだメインウィンドウの描画が終っていないため、親ウィンドウのサイズ取得が正しく行われません。回避方法としては、子ウィンドウを開く前に「すべてのイベントを処理」を入れて親ウィンドウの描画を完結させてください。

■ウィンドウ位置について
 Mindで作成したアプリケーションに限らず、Windows OS の流儀として、アプリケーションが起動した時のウィンドウ位置は”OS任せ”が基本となります。本GUIライブラリのサンプルソースの多くでウィンドウ位置を指定する記述が無いのはそのような理由です。ただし、明に指定することはできます。

■ウィンドウ位置を設定
 以下の処理単語によってユーザがウィンドウ位置を明に指定できます。

構文=
<X位置>と <Y位置>を     <ウィンドウID>に ウィンドウ位置を設定 → ・ <X位置>と <Y位置>を     <ウィンドウID>に ウィンドウ中央位置を設定 → ・ <X位置>と <Y位置>を     <ウィンドウID>に 親からの相対でウィンドウ位置を設定 → ・ <X位置>と <Y位置>を     <ウィンドウID>に 親からの相対でウィンドウ中央位置を設定 → ・    注:「ウィンドウ位置を設定」はウィンドウ有効化の前でも後でも使      えますが、他は有効化の後(ウィンドウ開いた後)でのみ使えます。      有効化の後で使う場合は本単語を実行したあと「変更を反映」に      より反映させる必要があります。    注:位置は絶対値以外に、ディスプレイサイズに対する比率も使えま      す。0.0超〜1.0までの小数形式を使ってください(比率指定であ      るかの判断は小数形式かどうかで見ています)      たとえば、0.5、0.5 を指定するとディスプレイ中央の座標を指      定したことになります。
 ウィンドウが開いた状態でのみ使えます(有効化より前は使えません)。
 本処理単語を実行したあとは必ず、
     <ウィンドウID>を 変更を反映
 とすることで変更を反映してください。
 メインウィンドウに対して「ウィンドウの位置を設定」を使った場合はさらに後続して、
     すべてのイベントを処理
を実行して確実に反映させてください。これを行わないと正しく機能しないことがあります。

     ●GUIエンジン特有の注意点
 この機能を利用してウィンドウ位置を変更した場合、ウィンドウが元の位置で一瞬現れた後に最終位置に移動する様子がわずか目撃されますが、これはGUIエンジンの特性であり、このようなものとご理解ください。

     ●「ウィンドウ中央位置を設定」の場合
 ウィンドウ左上隅の座標を指定するのではなく、ウィンドウの中央の座標、いわば ”ウィンドウの重心”の位置を指定する機能です。そのほかは「ウィンドウ位置を設定」と同じです。たとえば画面の真ん中ぴったりにアプリケーションのウィンドウを表示するケースで使えます。
 この機能を利用する場合は、前もって「すべてのイベントを処理」を実行することでウィンドウの描画を終わらせておいてください。理由は、座標計算時に、自らのウィンドウサイズを測定するため、ウィンドウの描画が完全に終わっている(自らのウィンドウサイズが確定)必要があるからです。
 先の「GUIエンジン特有の注意点」で述べたような、最終位置に移動する様子がわずか目撃される件は本機能でより目立つ傾向がありますが、これもGUIエンジンの特性とご理解ください。

     ●「親からの相対でウィンドウ(中央)位置を設定」 の場合
 ウィンドウ位置を画面上の絶対座標ではなく、親ウィンドウ左上隅の座標からの相対で指定するものです。子ウィンドウを親ウィンドウの近くに開きたい場合に使います。(位置お任せの時であっても、子ウィンドウは親ウィンドウの近くに表示されることが多いようですが本機能を使うことでより確実になります)
 なお、位置に小数(比率)を指定した場合、画面サイズ比率ではなく親のウィンドウサイズ比率として計算されることに注意してください。たとえば、位置として 1.0, 1.0 を指定した場合、親ウィンドウの右下隅を子ウィンドウの左上隅とするような位置に開きます。
 また、0.5, 0.5 を指定すれば子ウィンドウを親ウィンドウの真ん中に開くことができます。

■ウィンドウのリサイズ許可・禁止
 アプリケーションによってはウィンドウのリサイズを抑制したいことがあります。その目的で以下の処理単語を用意してあります。

構文=
<ウィンドウID>を リサイズ禁止  → ・ <ウィンドウID>を 横リサイズ禁止 → ・ <ウィンドウID>を 縦リサイズ禁止 → ・ <ウィンドウID>を リサイズ許可  → ・


 
 
フォーカス、最前面
 
 

 子ウィンドウを持つアプリケーションで複雑な処理をおこなう場合、その時に操作をしてもらいたいウィンドウを強制したいことがあります。俗に「フォーカスを当てる」と言われる操作です。

■フォーカスを当てる

構文=
<ウィンドウID>に フォーカスを当てる  → ・ <ウィジェットID>に フォーカスを当てる  → ・
       プログラム例:
子ウィンドウ1に フォーカスを当てる

ボタン1に フォーカスを当てる

 指定したウィンドウまたはウィジェットにフォーカスが当たります。
 この機能は対ウィンドウに限らず、ウィジェット一般に使えます。
 たとえばボタンウィジェットに適用することで、特定のボタンにフォーカスを当てることができます。ウィジェットへフォーカスを当てる例として、「バインドとイベント名」−「バインドの概念」 を参照してください。

■ウィンドウを最前面に表示

構文=
<ウィンドウID>を ウィンドウを最前面に表示  → ・
       プログラム例:
子ウィンドウ1を ウィンドウを最前面に表示する

■フォーカスロック

構文=
<ウィンドウID>を フォーカスロック    → ・     <ウィンドウID>を フォーカスロック解除  → ・
       プログラム例:
子ウィンドウ1を フォーカスロックする
子ウィンドウ1を フォーカスロック解除する
 マウスやキー入力などのイベントが、指定したウィンドウのみに割り当てられ、他のウィンドウには無反応となります(他のウィンドウは操作できなくなります)。
 「フォーカスを当てる」がその瞬間だけのフォーカス移動であるのに対して、この単語はずっとフォーカス状態を維持する点が異なります。たとえばダイアログで使います。(ダイアログ以外の部分を操作されると困るので)

■フォーカスと最前面表示の利用例
 たとえば、window-open-child というサンプルプログラムが有ります。メインウィンドウにあるボタンを押すと子ウィンドウが開きますが、何回か操作していると、開いた子ウィンドウが親ウィンドウにかぶさるように表示されることがあります。このとき、
     ”フォーカスはメインウィンドウにあるが、
     子ウィンドウがメインウィンドウの一部にかぶさり、
     メインウィンドウが全部見えない”
という少し変な状態になります。フォーカスが当たっていればそのウィンドウが全部見えるわけではなく、フォーカスと全部見えること(最前面表示)とは別の次元ということになります。
 アプリケーションが実現したい機能により対処は異なります。 もしメインウィンドウが全部見えることが優先なのであれば、子ウィンドウが開いたあと、メインウィンドウに対して「ウィンドウを最前面に表示」すれば解決します。
 逆に、子ウィンドウにフォーカスが当たって欲しいのであれば、子ウィンドウに対して「フォーカスを当て」すれば解決します。


 
 
(子)ウィンドウを開く、閉じる
 
 

■ウィンドウのIDを取得/有効化
 子ウィンドウは次のようにして開きます。

構文=
<親ウィンドウID>で ウィンドウのIDを取得 → ウィンドウID 〜〜(必要ならここで属性設定) 〜〜 <ウィンドウID>を 有効化する
 これから開こうとする子ウィンドウのIDを取得し、次に「有効化」で子ウィンドウを開きます。
       プログラム例: (window-open-child.exe を実行してみてください)
○○とは
        ウィンドウIDは ID

    メインウィンドウで ウィンドウのIDを取得し ウィンドウIDに 入れ
    ウィンドウIDを 有効化する

■子ウィンドウのネスト
 開いた子ウィンドウのIDを親として、さらに子ウィンドウ(孫ウィンドウ)を開くこともできます。
 さらなる子ウィンドウを”兄弟”にするか”孫”にするかはアプリケーション次第ですが、上位ウィンドウが閉じたときに子ウィンドウも自動的に閉じたいときは親子関係にすると良いです。

■ウィンドウを閉じる

構文=
<ウィンドウID>を ウィンドウを閉じる → ・      記:「ウィンドウを閉じる」は「ウィジェットを削除」と        等価な単語です
       プログラム例: ("window-destroy.src" を参照ください)
子ウィンドウのID記憶を ウィンドウを閉じる
 「ウィンドウを閉じる」により指定したウィンドウを閉じることができます。
 ウィンドウが閉じるとき、以下のことが自動的におこなわれます。
  (1)指定したウィンドウが持つウィジェット群は自動的に削除されます
  (2)指定したウィンドウで登録したイベントや、メニューなどのショート
     カットも抹消されます
  (3)指定したウィンドウがさらに子ウィンドウを持つ場合、それらのウィ
     ンドゥも閉じます。登録されたイベントやショートカットも抹消され
     ます
  (4)メインウィンドウを閉じると自動的にプログラムが終了します
     (「実行終り」を実行したのと同じ)


 
 
ウィンドウその他の操作
 
 

■ウィンドウが閉じるのを待つ

構文=
<ウィンドウID>を ウィンドウが閉じるのを待つ  → ・
       プログラム例: ("window-wait-window-close.src" を参照ください)
子ウィンドウ1が ウィンドウが閉じるのを待つ
 上記サンプルでは、親が子ウィンドウを開く直前にボタンを抑制していますが子ウィンドウがが閉じたことを待ってボタン活性化しています。このタイミング検出のために「ウィンドウが閉じるのを待つ」を使っています。
 ダイアログ系ウィジェットでもこれを使っています。
 遅延実行 の中でも書きましたが、GUIアプリケーションでは ”待つような単語を実行してはならない” を守って書く必要があります。しかし本単語は例外で「待つ系」単語ではあるものの、この単語実行中もウィンドウは反応する(イベント処理がおこなわれる)ので大丈夫です。
本単語を実行すると、ソースコード上での次のステップへは行きませんが、その間であってもイベント処理は発生して所要の単語は起動されます。(GUIがフリーズするようなことはありません)

■ウィンドウをアイコン化・隠す

構文=
<ウィンドウID>を ウィンドウをアイコン化   → ・ <ウィンドウID>を ウィンドウをアイコン化解除 → ・ <ウィンドウID>を ウィンドウを隠す      → ・ <ウィンドウID>を ウィンドウを見せる     → ・       注:「ウィンドウを見せる」は「ウィンドウをアイコン化解除」         と等価語です。
 指定したウィンドウをアイコン化または解除します。
 アイコン化すると、ウィンドウは見た目は消えますがそのアンコンだけがタスクバー内に表示され、まだ生きています。
 「ウィンドウを隠す」 は 「ウィンドウをアイコン化」 と良く似ています。違うのは、前者はいきなり消え、後者はタスクバーに飛んで行くアニメーションを伴なう点です。

■メインウィンドウが閉じる時の制御
 メインウィンドウのタイトルバー右端の「×」をクリックするなどでプログラムが終了するときの挙動を制御できます。これにより”本当に終了して良いのか”の確認をとったりできます。

構文=
メインウィンドウクローズ処理とは 本定義  (・ → ・)     ・・何らかの処理・・     ・・何らかの処理・・。
       プログラム例: (終了して良いのかのダイアログを表示する)
メインウィンドウクローズ処理とは 本定義  (・ → ・)
    「終っていいですか?」と
     ボタン・Yes/Noで
      メッセージとボタンをダイアログで表示し 1に 等しい
        ならば 実行終り
        つぎに。
       プログラム例: (終了して良いのかのダイアログを表示する)
"window-ask-when-closemain.src" を参照ください
 メインウィンドウが ”OSによって” 閉じられるとき、
       メインウィンドウクローズ処理
という仮定義/本定義された処理単語が呼び出されるようになっています。デフォルトでは「実行終り」が本定義されていますが、改めて本定義して上書きすることで任意の処理を実行できます。
 この本定義語が呼び出されるのは「実行終り」以外の方法、つまりプログラムで明に終了する以外の方法・・でメインウィンドウが閉じられる時です。たとえばタイトルバー右端の「×」をクリックする、あるいは、キーボードから Alt+F4 を打鍵する、タスクバーの当該アイコンを右クリックして「ウィンドウを閉じる」を選ぶなどです。
注1
本処理単語を本定義したのにもかかわらず、処理単語内で「実行終り」を実行しない場合、かつ、メインウィンドウ内に「閉じる」ボタンが無い場合、そのアプリケーションは通常の方法では終了できなくなり、タスクマネージャから停止するしかなくなります。
注2
たとえば「終了」ボタンを設置し、それが押下され、イベント処理内で「実行終り」を実行するなどして、明にプログラム終了する場合は本処理単語は呼び出されません。
そのような明なプログラム終了であっても終了確認をしたい場合には、確認処理を独立語として定義しておき、それぞれのイベント処理内で(実行終りをする前に)確認処理を呼び出すようにしてください。

■子ウィンドウが閉じる時の制御
 先の「メインウィンドウクローズ処理」はメインウィンドウ専用でしたが、子ウィンドウが閉じることに介入するにはイベントの仕組みを利用します。
 本機構を使うと、たとえば子ウィンドウが閉じる直前に何らかの必要な処理を実行し、そのあとでウィンドウを閉じる(あるいは閉じさせない)という動作をさせることができます。

構文=
(ステップ1):イベントの登録 <実行情報>と <引数>を <子ウィンドウID>に ウィンドウ消滅をイベント登録 → ・ (ステップ2):イベント発生時に渡されるパラメータ        ↓登録時の引数が空列のときは1つの引数のみ渡される      スタック→ 子ウィンドウID列、 1(引数個数)        ↓登録時の引数が非空列のとき      スタック→ 子ウィンドウID列、 引数1,・・、 n(引数個数)                                                        ユーザ引数が1個ならn=2
       プログラム例:
           (イベント処理)

ユーザ定義のウィンドウ消滅時処理とは (子ウィンドウID列、1 → ・)
        ID1は    ID
    (引数個数が) 1と 異なる
        ならば 「ウィンドウ消滅時処理のパラメータ異常」で 重大エラー
        つぎに        ↓IDを表す文字列を数値化
    (子ウィンドウID列を) ID列を数値化し ID1に 入れ

    〜閉じる前の何らかの処理〜

    ID1を ウィンドウを閉じること。  ←子ウィンドウを明に閉じる

           (イベントの登録)

○○とは
    〜略〜
    ユーザ定義のウィンドウ消滅時処理の 実行情報と
     空列を        ←引数不要なら「空列」を指定
      子ウィンドウのID記憶に
       ウィンドウ消滅をイベント登録し
    〜略〜。
 指定した子ウィンドウが閉じたときにイベントを発生するよう登録します。
 引数不要なら 「ウィンドウ消滅をイベント登録」 の呼び出しでは「空列」を引数として指定しますが、そのケースであっても、イベント処理が呼び出されたときにはスタックには1つのデータが積まれています。それが子ウィンドウのID(を文字列化したもの)です。
 子ウィンドウのIDはアプリケーションが承知しているから不要と思われるかも知れませんが、イベント処理の呼び出し時に子ウィンドウIDが渡されれば、子ウィンドウが複数ある場合であってもイベント処理定義は1つで済みます。
注1
本機構を利用してイベントが発生した場合、最終的に子ウィンドウを閉じるには明に「ウィンドウを閉じる」を実行する必要があります。
もし同イベント処理内で「ウィンドウを閉じる」を実行しない場合、子ウィンドウのタイトルバー右端の「×」を押すなどのOS標準の方法では閉じられなくなります。
注2
たとえば子ウィンドウ内に「閉じる」ボタンを設置し、そのイベント処理内で「ウィンドウを閉じる」を実行するなどして明に閉じる場合は本処理単語は呼び出されません。
そのようなケース(閉じるボタン押下など)でも終了確認をしたい場合には、閉じることの確認あるいは閉じる前の後片付けなどの処理を独立語として定義しておき、それぞれのイベント処理内で確認処理を呼び出してください。

■ID列を数値化
 先のプログラム例で 「ID列を数値化」 という処理単語を使っています。次のような仕様です。

構文=
<IDを表す文字列>を ID列を数値化 → ID(整数)
 「ウィンドウ消滅をイベント登録」 した処理単語が呼ばれたとき、スタックには子ウィンドウのIDが積まれていますが、数値ではなく文字列形式です。そのため本来のIDとして利用するにはこの「ID列を数値化」を通すことで通常のIDに変換してください。


 
 
ウィンドウ状態を参照
 
 

■画面サイズを得る

構文=
画面サイズを得る → X、Y        注:サイズはピクセル単位です
 画面サイズを得ます。
 物理的なディスプレイサイズとは異なることがあります。Windwsの拡大・縮小を反映した後の有効サイズを得ます。(このサイズまで描画できます)
 Windows OS が把握しているサイズと(特に高さがタスクバー高さとの関係で)わずかに異なることがありますがGUIエンジンの特性であり、バグではありません。

■ウィンドウの位置やサイズを得る

構文=
<ウィンドウID>で ウィンドウの位置とサイズを得る              → X位置、Y位置、Xサイズ、Yサイズ <ウィンドウID>で ウィンドウの位置を得る                → X位置、Y位置 <ウィンドウID>で ウィンドウのサイズを得る                → Xサイズ、Yサイズ          注:サイズや位置はピクセル単位です
 指定したウィンドウの位置やサイズを得ます。
 サンプル "window-geometry-immediate.exe" を起動するとメインウィンドウの位置とサイズを知ることができます。
 メインウィンドウが開いた直後とボタンを押した後では位置は同じでもサイズが違うことが確認できます。メインウィンドウが開いた直後ではまだメインウィンドウの描画が完了していないことが原因です(後者の値が正しいものです)。
 もし「メイン」の実行中に正しいウィンドウサイズを知りたければ、本処理単語を呼ぶ前に 「すべてのイベントを処理」 を実行してください。

■ウィンドウ存在?

構文=
<ウィンドウID>が ウィンドウ存在? → 真偽
       プログラム例: ("window-is-exist.src" を参照ください)
子ウィンドウのID記憶が ウィンドウ存在?を 有りに 入れ
 指定したウィンドウがまだ開いているか確認します。
 ウィンドウが 「ウィンドウを隠す」 または 「ウィンドウをアイコン化」 によってアイコン化されている場合も開いているのと同じ扱いで真を返します。


 
 
ウィンドウに関するサンプルプログラム
 
 


 以下のプログラムを実際に起動して確認してみてください。
window-ask-when-closemain.src/.exe
ウィンドウが閉じるときイベント発生(閉じて良いか尋ねる)
window-change-title-and-icon.src/.exe
タイトルバーとアイコンを設定
window-size-setting.src/.exe
メインウィンドウのサイズを設定
window-size-setting-bad.src/.exe
メインウィンドウに”小さなサイズ”を設定(すべて表示できず)
window-rootwin-setpos-absolute.src/.exe
メインウィンドウの位置とサイズを設定(絶対座標を指定)
window-rootwin-setpos-ratio.src/.exe
メインウィンドウの位置とサイズを設定(画面比率で指定)
window-rootwin-setpos-ratio-center.src/.exe
メインウィンドウの中央位置を画面中央に設定(画面比率で指定)
window-open-child.src/.exe
子ウィンドウを開く(サイズ/位置指定無し)
window-open-nest.src/.exe
子ウィンドウを開き、さらに孫ウィンドウを開く
window-open-complex.src/.exe
さまざまな位置でウィンドウを開く
window-geometry-immediate.src/.exe
メインウィンドウの位置とサイズをモニタ表示します。
(ラベル内にモニタ表示します)
window-geometry-debug.src/.exe
メインウィンドウの位置とサイズをモニタ表示します。
(デバッグ用のコンソールが開きそこへ表示します)
window-withdraw-and-iconify.src/.exe
ウィンドウをタイトルバーにアイコン化または隠す
window-is-exist.src/.exe
指定したウィンドウが開いているか調べる
window-destroy.src/.exe
ウィンドウを消す