基本 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 中で呼び出した DELETEMENUQQ,INSERTMENUQQ,APPENDMENUQQ またはその他のメニュー構成 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 で指定することができます。WINFULLSCREEN や WINSIZETOFIT のような他の既定ルーチンは,コールバック・ルーチンを呼ぶ前に 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