メニューのプログラムからの制御

基本 QuickWin メニューを使用する必要はありません。メニュー,メニュー項目一覧,メニュー・タイトル,または項目タイトルは,削除や変更を行うことができます。以下のことを行なうことができます。

初期のメニューとフレーム・ウィンドウの制御

INITIALSETTINGS 関数を定義することで,アプリケーションの基本フレーム・ウィンドウとメニューの初期外観を変更することができます。ユーザー定義 INITIALSETTINGS 関数がなければ,QuickWin は既定の INITIALSETTINGS ルーチンを呼び出して,基本フレーム・ウィンドウとメニューの外観を制御します。

アプリケーションから INITIALSETTINGS を呼び出す必要はありません。プロジェクト内にこの関数を用意しておくだけで,QuickWin が自動的に呼び出します。

INITIALSETTINGS を用意する場合,この中から初期メニューを設定し,フレーム・ウィンドウの大きさと場所を設定する QuickWin 関数を呼び出すことができます。メニュー関数以外にも,INITIALSETTINGS 関数から SETWSIZEQQ を呼び出して,ウィンドウが最初に描画される前にフレーム・ウィンドウの大きさと場所を調整することができます。

次に INITIALSETTINGS の例を示します。

	  LOGICAL(4) FUNCTION INITIALSETTINGS( )
	    USE DFLIB
	    LOGICAL(4) result
	    TYPE (qwinfo) qwi
	! Set window frame size.
	    qwi.x = 0
	    qwi.y = 0
	    qwi.w = 400
	    qwi.h = 400
	    qwi.type = QWIN$SET
	    i = SetWSizeQQ( QWIN$FRAMEWINDOW, qwi )
	! Create first menu called Games.
	    result = APPENDMENUQQ(1, $MENUENABLED, '&Games'C, NUL )
	! Add item called TicTacToe.
	    result = APPENDMENUQQ(1, $MENUENABLED, '&TicTacToe'C, WINPRINT)
	! Draw a separator bar.
	    result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C, NUL )
	! Add item called Exit.
	    result = APPENDMENUQQ(1, $MENUENABLED, 'E&xit'C, WINEXIT )
	! Add second menu called Help.
	    result = APPENDMENUQQ(2, $MENUENABLED, '&Help'C, NUL )
	    result = APPENDMENUQQ(2, $MENUENABLED, '&QuickWin Help'C, WININDEX)
	    INITIALSETTINGS= .true.
	  END FUNCTION INITIALSETTINGS

QuickWin は,フレーム・ウィンドウを作成する前に,初期化の過程で INITIALSETTINGS 関数を実行します。関数が実行を終えると,制御は QuickWin に戻され,残りの初期化作業が行われます。その後,制御は Visual Fortran アプリケーションに渡されます。

プロジェクトに INITIALSETTINGS 関数に対するコードのみを含む必要があります。それがプロジェクトの一部である場合,INITIALSETTINGS 関数を呼ぶ出す必要はありません。

INITIALSETTINGS 関数には,フレーム・ウィンドウの場所と大きさとメニュー項目を指定することができます。フレーム・ウィンドウが作成される前に,INITIALSETTINGS 関数が実行されるため,フレーム・ウィンドウを完全に初期化するためのルーチンを呼び出してはいけません。たとえば,フォーカスのある子ウィンドウを参照するルーチン (たとえば,SETWINDOWCONFIG) または特定の子ウィンドウ装置番号を参照するルーチン (たとえば,OPEN) は,INITIALSETTINGS 関数から呼び出されるべきではありません。

INITIALSETTINGS 関数は,実行に成功した場合には .TRUE. を,失敗した場合には .FALSE. を返さなくてはなりません。QuickWin の基本関数は .TRUE. の値のみを返します。

基本メニューは,INITIALSETTINGS が呼び出された後で,プログラマが独自のメニューを作成しなかった場合にのみ作成されることに注意してください。このため,INITIALSETTINGS 中で呼び出した DELETEMENUQQINSERTMENUQQAPPENDMENUQQ またはその他のメニュー構成 QuickWin 関数は,基本 QuickWin メニューではなく,カスタム・メニューにのみ影響を与えます。

メニュー項目の削除,挿入,および追加

メニューは左から右へ,左端を 1 として定義されます。メニュー項目は上から下へ,上端 (メニュー・タイトルそのもの) を 0 として定義されます。プログラマが用意する INITIALSETTINGS 中では,カスタム・メニューのメニュー項目の削除,挿入,および追加を行うことができます。INITIALSETTINGS の外でも,アプリケーションの任意の場所で,基本 QuickWin メニューとカスタム・メニューの両方を変更することができます。基本 QuickWin メニューは,INITIALSETTINGS が実行された後に,またプログラマがカスタム・メニューを作成しなかった場合にのみ作成されます。

メニュー項目を削除するには,DELETEMENUQQ でメニュー番号と項目番号を指定します。メニュー全体を削除するには,そのメニューの項目0を削除します。次に例を示します。

	USE DFLIB
	LOGICAL status
	status = DELETEMENUQQ(1, 2)	! Delete the second menu item from
					! menu 1 (the default FILE menu).
	status = DELETEMENUQQ(5, 0)	! Delete menu 5 (the default Windows
					! menu).

INSERTMENUQQ は,メニュー項目またはメニューを挿入し,そのコールバック・ルーチンを登録します。QuickWin は,プログラムを終了する WINEXIT,QuickWin ヘルプを一覧表示する WININDEX,および現在のウィンドウの内容をクリップボードにコピーする WINCOPY などのいくつかの標準コールバック・ルーチンを用意しています。コールバック一覧については,APPENDMENUQQ または INSERTMENUQQ を参照してください。

一般に,プログラマは,ユーザーがメニューから選択を行ったときに特定の動作を実行するために,独自のコールバック・ルーチンを用意します。

一般論として,メニュー項目の状態は,それを変更したとき (横にチェックマークを付ける,灰色で表示する,無効にする,または有効にする) に正しく更新されない可能性があるので,複数のメニューに同じコールバック・ルーチンを割り付けるべきではありません。メニュー項目やメニューを既存の番号を超えて挿入することはできません。つまり,項目 5 と 6 が存在しないときに項目 7 を挿入することはできません。メニュー全体を挿入するには,メニュー項目 0 を指定します。新しいメニューは,既存のメニューの間,または直後の任意の位置に追加することができます。

既存のメニューがすでに占めているメニュー位置を指定すると,既存のメニューと,その右にあるすべてのメニューが右にずれ,メニュー番号が 1 つずつ増やされます。

たとえば,次のコードはメニュー 5 (基本「Window」メニュー) に,「Position」という名前の 5 番目のメニュー項目を挿入します。

	USE DFLIB
	LOGICAL(4) status
	status = INSERTMENUQQ (5, 5, $MENUCHECKED, 'Position'C, WINPRINT)

次のコードは,メニュー位置 3 に「My List」という名前の新しいメニューを挿入します。現在,位置 3 にあるメニューとその右にあるすべてのメニュー (基本「View」,「State」,「Window」,および「Help」メニュー) は,右に 1 つずつずれます。

	USE DFLIB
	LOGICAL(4) status
	status = INSERTMENUQQ(3,0, $MENUENABLED, 'My List'C, WINSTATE)

APPENDMENUQQ を使うとメニュー項目を追加することができます。項目はメニュー一覧の一番下に追加されます。メニュー項目がまだ存在しない場合,追加された項目は最上位のメニュー項目として扱われ,それに割り付けた文字列がメニューバーに表示されます。次の例は,最初のメニュー (基本「File」メニュー) に「Cascade Windows」という名前のメニュー項目を追加します。

	USE DFLIB
	LOGICAL(4) status
	status = APPENDMENUQQ(1, $MENUCHECKED, 'Cascade Windows'C, &
	& WINCASCADE)

この例の $MENUCHECKED フラグは,メニュー項目の横にチェックマークを付けます。このチェックマークを削除するには,MODIFYMENUFLAGSQQ 関数でフラグを $MENUUNCHECKED に設定します。一部の既定ルーチン (WINSTATUS など) は,独自にチェックマークの更新を行います。しかし,ルーチンが複数のメニュー項目に対して登録されていると,チェックマークは正しく更新されない場合があります。コールバック・ルーチンとその他のフラグ一覧については,APPENDMENUQQ または INSERTMENUQQ を参照してください。

メニュー項目の変更

MODIFYMENUSTRINGQQ は,メニュー項目の文字列識別子を変更し,MODIFYMENUROUTINEQQ は,項目が選択されたときに呼び出されるコールバック・ルーチンを変更し,MODIFYMENUFLAGSQQ は,メニュー項目の状態 (有効,灰色での表示,チェックマークなど) を変更することができます。

次のコード例は,MODIFYMENUSTRINGQQ を使って,第 1 メニュー (基本「File」メニュー) の第 4 メニュー文字列を「Tile Windows」に変更し,MODIFYMENUROUTINEQQ を使って,その項目が選択されたときに呼び出されるコールバック・ルーチンを WINTILE に変更し,MODIFYMENUFLAGSQQ を使って,メニュー項目の横にチェックマークを付けています。

	status = MODIFYMENUSTRINGQQ( 1, 4, 'Tile Windows'C)
	status = MODIFYMENUROUTINEQQ( 1, 4, WINTILE)
	status = MODIFYMENUFLAGSQQ( 1, 4, $MENUCHECKED)

使用可能な子ウィンドウのメニュー一覧の作成

基本設定では,「Window」メニューには QuickWin アプリケーションのすべての子ウィンドウを開く一覧が含まれています。SETWINDOWMENUQQ は,現在開かれている子ウィンドウ一覧を表示するメニューを,プログラマが指定したメニューに変更します。子ウィンドウ名一覧は,プログラマが選択したメニューの末尾に追加され,それまでその一覧を含んでいた他のメニューからは削除されます。次に例を示します。

	  USE DFLIB
	  LOGICAL(4) status
	  ...
	! Append list of open child windows to menu 1
	! (the default File menu)
	  status = SETWINDOWMENUQQ(1)

メニュー選択のシュミレーション

CLICKMENUQQ は,「Window」メニューからメニュー・コマンドをクリックまたは選択したときの効果をシュミレーションします。QuickWin アプリケーションは,ユーザーがそのコマンドをクリックまたは選択したかのように動作します。次のコードは,「Window」メニューの「Tile」項目を選択したときの効果をシュミレーションします。

	USE DFLIB
	INTEGER(4) status
	status = CLICKMENUQQ(QWIN$TILE)

「Window」メニューからの項目は,CLICKMENUQQ で指定することができます。WINFULLSCREENWINSIZETOFIT のような他の既定ルーチンは,コールバック・ルーチンを呼ぶ前に LOC 組込み関数を含む引数を持つ CLICKMENUQQ を呼び出すことで呼び出せます。コールバック・ルーチン名一覧については,APPENDMENUQQ を参照してください。WINSIZETOFIT を呼び出す例を以下に示します。

	! Some of the callback subroutine names listed
	! in APPENDMENUQQ may not work or be
	! useful in this context, but they will be "called".
	! Run the program and note how the scroll bars disappear
	  use dflib
	  integer*4 result
	  character*1 ch
	  print *,'type a character'
	  read(*,*) ch
	  result = clickmenuqq(loc(WINSIZETOFIT))
	  print *,'type a character'
	  read(*,*) ch
	  end