ウィンドウにフォーカスを与え,ウィンドウを活動状態にする方法

活動状態になったウィンドウは (ARCLINETOOUTGTEXT などからの) グラフィックス出力を受け取りますが,最前面には置かれないので,フォーカスは持っていません。マウス・クリック,I/O,または FOCUSQQ 呼び出しによってフォーカスを取得したウィンドウは,同時に活動状態ウィンドウにもなります。ウィンドウがフォーカスを得ると,フォーカスを持っていたウィンドウはフォーカスを失います。

ウィンドウを最前面に移動する必要がある場合,そのウィンドウにフォーカスを与えなくてはなりません。フォーカスを持つウィンドウはつねに一番上に置かれ,他のすべてのウィンドウはタイトルバーが灰色で表示されます。ウィンドウは,フォーカスを持ちながらも活動状態ではなく,グラフィックス出力を受け取らないようにすることができます。グラフィックス出力はフォーカスとは関係ありません。

ほとんどの場合,フォーカスを持つウィンドウと活動状態ウィンドウは同じウィンドウになります。これは QuickWin の基本動作であり,プログラマはこの基本動作を意識的に置換する必要があります。

装置番号を入力引数として取る一部の QuickWin ルーチン (GETCHARQQPASSDIRKEYSQQ,および SETWINDOWCONFIG など) は,通常は,フォーカスを持っているかどうかとは関係なく,活動状態ウィンドウに作用します。

別のフォーカスを持っていないウィンドウが活動状態になっていると,これらのルーチンはルーチン呼び出しの時点で活動状態になっていたウィンドウに作用します。これはユーザーにとっては奇妙に思えるかもしれません。なぜならば,このような状況での GETCHARQQ は,灰色で表示されている後面ウィンドウからの入力を待つことになるからです。この場合,ユーザーはそのウィンドウをクリックしてから入力を開始しなくてはなりません。

これらの (活動状態ウィンドウに作用する) ルーチンを使用するには,フォーカスを与えたい (同時に活動状態にしたい) ウィンドウの装置番号に対して I/O を行うか,(装置番号を指定して) FOCUSQQ を呼び出します。ウィンドウが 1 つしか開かれていない場合,ルーチンはそのウィンドウに作用します。複数のウィンドウが開かれている場合,最後に開かれたウィンドウが対象となります。これは,開かれたことの副作用として,そのウィンドウがフォーカスを持ち,活動状態になっているからです。

OPEN (IOFOCUS) パラメタも,I/O 文がその装置に対して実行されたときに,ウィンドウがフォーカスを受け取るかどうかを決定することができます。次に例を示します。

	OPEN (UNIT = 10, FILE = 'USER', IOFOCUS = .TRUE.)

FILE='USER' で明示的に開くとすると,IOFOCUS の基本値は .TRUE. です。装置番号 0,5,6 で暗黙のうちに開かれた子ウィンドウ (READWRITE または PRINT 文の前に OPEN 文がない) では,IOFOCUS の基本値は .FALSE. となります。

IOFOCUS=.TRUE. になっていると,子ウィンドウは個々の READWRITE,または PRINT の前にフォーカスを受け取ります。OUTTEXT またはグラフィックス関数 (OUTGTEXTLINETO,および ELLIPSE など) を呼び出しても,フォーカスは移動しません。IOFOCUS を QuickWin 子ウィンドウ以外の装置に対して使用すると,実行時エラーが発生します。

フォーカスが特定のウィンドウに移動するのは,FOCUSQQ でフォーカスが与えられたとき,マウス・クリックによって選択されたとき,または,ウィンドウが IOFOCUS=.FALSE. で開かれていないときに,グラフィックス操作以外の I/O 操作が実行されたときです。INQFOCUSQQ は,どの装置がフォーカスを持つのかを決定します。次に例を示します。

	  USE DFLIB
	  INTEGER(4) status, focusunit
	  OPEN(UNIT = 10, FILE = 'USER', TITLE = 'Child Window 1')
	  OPEN(UNIT = 11, FILE = 'USER', TITLE = 'Child Window 2')
	! Give focus to Child Window 2 by writing to it:
	  WRITE (11, *) 'Giving focus to Child 2.'
	! Give focus to Child Window 1 with the FOCUSQQ function:
	  status = FOCUSQQ(10)
	  ...
	! Find out the unit number of the child window
	! that currently has focus:
	  status = INQFOCUSQQ(focusunit)

SETACTIVEQQ は,子ウィンドウを最前面に移動せずに活動状態にします。GETACTIVEQQ は現在活動状態である子ウィンドウの装置番号を返します。GETHWNDQQ は,装置番号を必要とする関数のために Windows ハンドルに変換します。