You do not have to use the default QuickWin menus. You can eliminate and alter menus, menu item lists, menu titles or item titles. The QuickWin functions that control menus are described in the following sections:
Controlling the Initial Menu and Frame
You can change the initial appearance of an application's default frame window and menus by defining an
INITIALSETTINGSfunction. If no user-defined
INITIALSETTINGSfunction is supplied, QuickWin calls a predefined (default)
INITIALSETTINGSroutine that provides a default frame window and menu.
Your application does not call
INITIALSETTINGS. If you supply the function in your project, QuickWin calls it automatically.
If you supply it,
INITIALSETTINGScan call QuickWin functions that set the initial menus and the size and position of the frame window. Besides the menu functions,
SETWSIZEQQcan be called from your
INITIALSETTINGSfunction to adjust the frame window size and position before the window is first drawn.
The following is a sample of
LOGICAL FUNCTION INITIALSETTINGS( ) USE IFQWIN LOGICAL 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 executes your
INITIALSETTINGSfunction during initialization, before creating the frame window. When your function is done, control returns to QuickWin and it does the remaining initialization. The control then passes to the Fortran application.
You only need to include the code for an
INITIALSETTINGSfunction in your project. If it is part of your project, you do not need to call your
INITIALSETTINGSfunction can specify the position and size of the frame window and the contents of the menus. Because the
INITIALSETTINGSfunction is executed before creating the frame window, it must not call any routines that require that frame window initialization be complete. For example, routines that refer to the child window in focus (such as
SETWINDOWCINFIG) or a specific child window unit number (such as
OPEN) should not be called from the
INITIALSETTINGSfunction should return .TRUE. if it succeeds, and .FALSE. otherwise. The QuickWin default function returns a value of .TRUE. only.
Note that default menus are created after
INITIALSETTINGShas been called, and only if you do not create your own menus. Therefore, using
APPENDMENUQQ, and the other menu configuration QuickWin functions while in
INITIALSETTINGSaffects your custom menus, not the default QuickWin menus.
Deleting, Inserting, and Appending Menu
Menus are defined from left to right, starting with 1 at the far left. Menu items are defined from top to bottom, starting with 0 at the top (the menu title itself). Within
INITIALSETTINGS, if you supply it, you can delete, insert, and append menu items in custom menus. Outside
INITIALSETTINGS, you can alter the default QuickWin menus as well as custom menus at any point in your application. (Default QuickWin menus are not created until after
INITIALSETTINGShas run and only if you do not create custom menus.)
To delete a menu item, specify the menu number and item number in
DELETEMENUQQ. To delete an entire menu, delete item 0 of that menu. For example:
USE IFQWIN 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).
INSERTMENUQQinserts a menu item or menu and registers its callback routine. QuickWin supplies several standard callback routines such as WINEXIT to terminate a program, WININDEX to list QuickWin Help, and WINCOPY which copies the contents of the current window to the Clipboard. A list of available callbacks is given in the
Often, you will supply your own callback routines to perform a particular action when a user selects something from one of your menus.
In general, you should not assign the same callback routine to more than one menu item because a menu item's state might not be properly updated when you change it (put a check mark next to it, gray it out, or disable, or enable it). You cannot insert a menu item or menu beyond the existing number; for example, inserting item 7 when 5 and 6 have not been defined yet. To insert an entire menu, specify menu item 0. The new menu can take any position among or immediately after existing menus.
If you specify a menu position occupied by an existing menu, the existing menu and any menus to the right of the one you add are shifted right and their menu numbers are incremented.
For example, the following code inserts a fifth menu item called
Positioninto menu 5 (the default Windows menu):
USE IFQWIN LOGICAL status status = INSERTMENUQQ (5, 5, $MENUCHECKED, 'Position'C, WINPRINT)
The next code example inserts a new menu called
My Listinto menu position 3. The menu currently in position 3 and any menus to the right (the default menus View, State, Windows, and Help) are shifted right one position:
USE IFQWIN LOGICAL status status = INSERTMENUQQ(3,0, $MENUENABLED, 'My List'C, WINSTATE)
You can append a menu item with . The item is added to the bottom of the menu list. If there is no item yet for the menu, your appended item is treated as the top-level menu item, and the string you assign to it appears on the menu bar.
The QuickWin menu routines like
APPENDMENUQQlet you to create a single level of menu items beneath a menu name. You cannot create submenus with the QuickWin project type.
The following code uses
APPENDMENUQQto append the menu item called
Cascade Windowsto the first menu (the default File menu):
USE IFQWIN LOGICAL status status = APPENDMENUQQ(1, $MENUCHECKED, 'Cascade Windows'C, & & WINCASCADE)
The $MENUCHECKED flag in the example puts a check mark next to the menu item. To remove the check mark, you can set the flag to $MENUUNCHECKED in the
MODIFYMENUFLAGSQQfunction. Some predefined routines (such as WINSTATUS) take care of updating their own check marks. However, if the routine is registered to more than one menu item, the check marks might not be properly updated. See
Language Referencefor the list of callback routines and other flags.
Modifying Menu Items
MODIFYMENUSTRINGQQcan modify the string identifier of a menu item,
MODIFYMENUROUTINEQQcan modify the callback routine called when the item is selected, and
MODIFYMENUFLAGSQQcan modify a menu item's state (such as enabled, grayed out, checked, and so on).
The following example code uses
MODIFYMENUSTRINGQQto modify the menu string for the fourth item in the first menu (the File menu by default) to
Tile Windows, it uses
MODIFYMENUROUTINEQQto change the callback routine called if the item is selected to
WINTILE, and uses
MODIFYMENUFLAGSQQto put a check mark next to the menu item:
status = MODIFYMENUSTRINGQQ( 1, 4, 'Tile Windows'C) status = MODIFYMENUROUTINEQQ( 1, 4, WINTILE) status = MODIFYMENUFLAGSQQ( 1, 4, $MENUCHECKED)
Creating a Menu List of Available Child
By default, the Windows menu contains a list of all open child windows in your QuickWin applications.
SETWINDOWMENUQQchanges the menu which lists the currently open child windows to the menu you specify. The list of child window names is appended to the end of the menu you choose and deleted from any other menu that previously contained it. For example:
USE IFQWIN LOGICAL status ... ! Append list of open child windows to menu 1 (the default File menu) status = SETWINDOWMENUQQ(1)
Simulating Menu Selections
CLICKMENUQQsimulates the effect of clicking or selecting a menu command from the Window menu. The QuickWin application behaves as though the user had clicked or selected the command. The following code fragment simulates the effect of selecting the Tile item from the Window menu:
USE IFQWIN INTEGER status status = CLICKMENUQQ(QWIN$TILE)
Items from the Window menu can be specified in
CLICKMENUQQ. Other predefined routines such as WINFULLSCREEN and WINSIZETOFIT (see the callback subroutine names listed in
APPENDMENUQQ) can be invoked by calling
CLICKMENUQQwith an argument containing the
LOCintrinsic function before the callback routine name. For example, the following program calls 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 IFQWIN integer result character*1 ch print *,'type a character' read(*,*) ch result = clickmenuqq(loc(WINSIZETOFIT)) print *,'type a character' read(*,*) ch end