QuickWin で新しい画面を作成するためには OPEN 文を使います。
OPEN(10, FILE='USER', TITLE='This is a title.')
ここでポイントは FILE オプションです。 ファイル名として 'USER' を与えると、 通常のファイルでなく QuickWin の新しい画面が開かれます。 そして TITLE オプションによって指定された文字列が 画面上部に表示されます。 装置番号は通常のファイルの場合と同様、 5 と 6 以外の任意の正の整数が使用できます。
新しい画面が開かれると同時に その画面がアクティブになります。 そのため、それ以降の描画命令は その最新の画面に描かれることになります。 アクティブな画面を切り替える方法については 後述します。 また、その画面に文字を出力したい場合は次のようにします。
WRITE(10, 600) 600 FORMAT('この文字は新しい画面に表示されます')
さて、もうその画面が不要になった場合は閉じてしまいましょう。
CLOSE(10)
CLOSE(10, STATUS='KEEP')
前者の場合、装置番号 10 番の画面が使用できなくなり、 その画面が完全に消滅します。 後者の場合、装置番号 10 番の画面が使用できなくなりますが、 その画面は消えずに表示されたままとなり、 閉じられたことを示す Closed という表示が 画面上部のタイトルに追加されます。
アクティブな画面とは、 描画命令の結果が出力される画面のことです。 アクティブな画面が必ずしもフォーカスを持つとは限りません。
アクティブな画面を切り替えたい場合は、 その画面の装置番号を引数として 次のルーチンを呼びます。 result に返される値は、 成功のとき 1、失敗の時 0 となります。
integer*4 result result = SETACTIVEQQ(10)
新しい画面を OPEN した場合、 その画面が自動的にアクティブになります。 また、WRITE 文によって文字または数値が出力された場合にも その画面が自動的にアクティブとなります。
フォーカスを持つ画面とは、 最も上面に存在するタイトルバーの青い画面のことです。 フォーカスを持つ画面が必ずしもアクティブであるとは限りません。
画面のフォーカスを切り替えたい場合は、 その画面の装置番号を引数として 次のルーチンを呼びます。 result に返される値は、 成功のときは 0、失敗の時は 0 以外となります。
integer*4 result result = FOCUSQQ(10)
SETACTIVEQQ と FOCUSQQ とで、 似たような機能の関数にも関わらず戻り値の意味が正反対です。 マニュアルの説明に出てくる変数名も、一方は result、 もう一方は status でした。 Microsoft って会社は何を考えているのでしょうか。 良い子のみんなは真似しちゃいけませんよ。
type (QWINFO) winfo integer*4 result open(10, file='USER', title='This is a cild window.') winfo.H = 100 winfo.W = 200 result = SETWSIZEQQ(10, winfo)
画面のサイズは SETWSIZEQQ に装置番号と画面情報を与えることで設定します。 result には成功の時は 0、失敗の時は 0 以外が返されます。
integer*4 ireq type (QWINFO) winfo integer*4 result open(10, file='USER', title='This is a cild window.') ireq = QWIN$SIZECURR result = GETWSIZEQQ(10, ireq, winfo) write(*,*) 'Window size is ', winfo.W, ' by ', winfo.H
画面のサイズは GETWSIZEQQ に装置番号とリクエスト ireq、そして結果を格納する winfo を与えることで取得します。 result には成功の時は 0、失敗の時は 0 以外が返されます。 ireq には、現在の画面サイズを取得する時は QWIN$SIZECURR、 最大のサイズを取得する時は QWIN$SIZEMAX を与えます。
winf.X = 0 winf.Y = 20 result = SETWSIZEQQ(10, winfo)
実は、SETWSIZEQQ は画面の大きさと同時に位置も指定することが可能です。 同様に、GETWSIZEQQ も画面の位置を読み込むことが可能です。 位置の基準は画面の左上の角となります。