Процедуры для работы с диалоговыми окнами.
Этот раздел носит в значительной степени справочный характер. Приложения QwickWin используют ограниченный набор процедур, интерфейсы которых описаны в модуле ‘dflogm.f90’. Приложение содержит диалоговые окна (dialogs), которые как контейнеры содержат управляющие элементы (controls). Главная программа в приложениях QwickWin практически всегда выполняет единственную функцию: подготовка стартового диалога и отображения его на рабочем столе. В программе 2 это строки 9 – 12. Ко всем ресурсам, кроме диалога, обращаются по идентификатору ресурса (ID). Идентификатор ресурса может быть либо символическое имя для диалогового окна или идентификатор, которые перечислены в файле RESOURCE.FD. Во всех диалоговых функциях обращение к диалогу осуществляется по диалоговой переменной. Эта переменная производного (derive) типа:
type(dialog) dlg
Переменная dlg должна быть инициализирована нашим конкретным диалогом, который определен (ID) в файле RESOURCE.FD буквальной и символической константой.
Функция, выполняющая инициализацию, имеет формат вызова:
tf = DlgInit(id, dlg)
id (вход) INTEGER(4). Идентификатор диалогового окна. В программе 2, стр. 9: id – IDD_DIALOG1: tf = DlgInit(IDD_DIALOG1, dlg)
dlg (Output) переменная производного типа.
Результат tf - переменная логического типа, возвращающая .TRUE. в случае успеха, иначе .FALSE.
Следующей рассмотрим функцию (программа 2, стр. 12)
res = DlgModal (dlg)
Эта функция отображает диалог и ожидает событий в этом окне. События могут быть вызваны действиями пользователь с помощью мышки или клавиатуры. Этот модальный диалог может быть закрыт только вызовом подпрограммы call DlgExit(dlg). В нашем примере эта процедура вызывается в процедуре отклика на нажатие клавиши Cancel
Функция DlgModal (dlg) возвращает в случае успеха идентификатор элемента управления, вызвавшего процедуру, закрывающую диалог. В нашем случае это кнопка Cancel. Возвращаемое значение может быть изменено с подпрограммы DlgSetReturn (программа 4, стр. 8).
Теперь можно показать скелет главной программы с диалоговым интерфейсом:
Программа 6.
program main
use dflogm
implicit none
include "resource.fd"
integer res
logical tf
! описания других локальных переменных
! и внешних процедур, включая процедуры отклика на события
type(dialog) dlg
tf = DlgInit(IDD_DIALOG1, dlg)
! процедуры задания начальных параметров и
! подписка на обработку событий, генерируемых объектами управления
! диалогового окна.
res = DlgModal(dlg)
! по результату res могут вызываться другие диалоги.
End
Программа 6 можно компилировать, компоновать и выполнить. При этом на экране будет отображен сконструированный нами диалог. При нажатии кнопок «OK» и «Cancel» произойдет закрытие окна. Дело в том, что компоновщик присоединил без нашего участия процедуры отклика на нажатие этих клавиш, которые содержат вызовы call DlgExit(dlg). Если в диалоге есть другие кнопки, их нажатие без подписки, обработаны не будут.
УПРАЖНЕНИЕ: Выполнить программу 6. Последовательность действий следующая:
Создаем проект QwickWin. Для этого выполним
File -> New ->
В открывшемся окне с закладками открыта страница Projects. Заполним текстоваэ окна подобно рис.
Рис. 5
Мы назвали проект First, а расположится он в D:\Work\fortran\First. После нажатия кнопки OK мастер создания проектов отроет последовательно следующие два окна, с установками которых рекомендуем согласиться. В результатом этих действий создается проект и открывается окно проекта.
Разработаем пользовательский интерфейс. Для этого выполним
Insert -> Resource -> и в открывшемся окне выбираем «Dialjg» -> New
В результате в рабочем окне проекта появится пригодное для редактирования диалог, содержащий уже два объекта управления, кнопки OK и CANCEL.
Не будем изменять параметры диалога и не будем добавлять объекты управления. Сохраним этот файл ресурсов в папке проекта, задав ему имя проекта :
File -> Save as ->
Добавим файл ресурсов First.rc в проекте First.
Project -> Add To Project -> Files…-> и выделив файл First.rc добавим к проекту (кнопка OK).
Этот файл добавится в виртуальной папке Source File. Лучше перенести его в папку Resource File. Это никак не скажется, так как папки виртуальне, но упорядочит браузер проекта. Одновременно с файлом ресурсов в корневом каталоге проекта создается заголовочный файл resource.fd. Напомним, что этот файл содержит определения символических констант идентификаторов ресурсов(ID). Его не обязательно включать в проект. Он включается в программы инструкцией include “resource.fd”, но, если он будет в проекте, его просто вывести в рабочее окно для копирования символических имен ресурсов (диалога и объектов управления).
Теперь самое время написать главную программу. Для этого
Project -> Add To Project -> New->
Выбрали тип файла: Fortran Free Format Source File; прочекели «Add to project»; задали имя файла First (совпадает с именем проекта), а остальные поля заполнились сами. В рабочее окно редактора введите текст программы 6.
Выполним компиляцию, компоновку и выполнение. Это можно выполнить последовательно, а можно в пакете. Для выполнения в пакете можно использовать «горячие клавиши» Ctrl +F5. На экране появится диалоговое окно с двумя кнопками «OK» и «Cancel». Нажатие любой клавиши закроет диалог и завершит
программу.
Ниже приведен необходимый список процедур управления диалогами:
№ |
Dialog function |
Description |
1 |
DLGINIT |
Инициализация диалога |
2 |
DLGMODAL |
Отображение на дисплее модального диалогового окна. |
3 |
DLGEXIT |
Закрытие открытого диалога. |
4 |
DLGUNINIT |
Освобождение памяти инициализированного ранее диалога. |
5 |
DLGSETTITLE |
Установка заголовка диалога |
6 |
DLGSETSUB |
Подписка на определенную процедуру отклика на событие. |
7 |
DLGSET |
Установка значения свойства объекта управления. |
8 |
DLGGET |
Чтение значения свойства объекта управления. |
9 |
DLGSETRETURN |
Установка возвращаемого значения для DLGMODAL |
УПРАЖНЕНИЕ: Выполнить проект, содержащий программы 2 – 6. Рекомендуется просмотреть справки по всем диалоговым процедурам, воспользовавшись контекстной справкой.
Об этом дальще…………..
MESSAGEBOXQQ
QuickWin Function: Displays a message box in a QuickWin window.
Module: USE DFLIB
Syntax
result = MESSAGEBOXQQ (msg, caption, mtype)
msg (Input) Character*(*). Null-terminated C string. Message the box displays.
caption (Input) Character*(*). Null-terminated C string. Caption that appears in the title bar.
mtype (Input) INTEGER(4). Symbolic constant that determines the objects (buttons and icons) and attributes of the message box. You can combine several constants (defined in DFLIB.F90 in the \DF98\INCLUDE subdirectory) using an inclusive OR (IOR or OR). The symbolic constants and their associated objects or attributes are:
MB$ABORTRETRYIGNORE: The Abort, Retry, and Ignore buttons.
MB$DEFBUTTON1: The first button is the default.
MB$DEFBUTTON2: The second button is the default.
MB$DEFBUTTON3: The third button is the default.
MB$ICONASTERISK: Lowercase i in blue circle icon.
MB$ICONEXCLAMATION: The exclamation-mark icon.
MB$ICONHAND: The stop-sign icon.
MB$ICONINFORMATION: Lowercase i in blue circle icon.
MB$ICONQUESTION: The question-mark icon.
MB$ICONSTOP: The stop-sign icon.
MB$OK: The OK button.
MB$OKCANCEL: The OK and Cancel buttons.
MB$RETRYCANCEL: The Retry and Cancel buttons.
MB$SYSTEMMODAL: Box is system-modal: all applications are suspended until the user responds.
MB$YESNO: The Yes and No buttons.
MB$YESNOCANCEL: The Yes, No, and Cancel buttons.
Results:
The result type is INTEGER(4). The result is zero if memory is not sufficient for displaying the message box. Otherwise, the result is one of the following values, indicating the user's response to the message box:
MB$IDABORT: The Abort button was pressed.
MB$IDCANCEL: The Cancel button was pressed.
MB$IDIGNORE: The Ignore button was pressed.
MB$IDNO: The No button was pressed.
MB$IDOK: The OK button was pressed.
MB$IDRETRY: The Retry button was pressed.
MB$IDYES: The Yes button was pressed.
Compatibility
QUICKWIN GRAPHICS LIB
See Also: ABOUTBOXQQ, SETMESSAGEQQ, Using QuickWin
Example
! Build as QuickWin app
USE DFLIB
message = MESSAGEBOXQQ('Do you want to continue?'C, &
'Matrix'C, &
MB$ICONQUESTION.OR.MB$YESNO.OR.MB$DEFBUTTON1)
END
result = ABOUTBOXQQ (cstring)
result = APPENDMENUQQ (menuID, flags, text, routine)
result = DELETEMENUQQ (menuID, itemID)
result = MODIFYMENUSTRINGQQ (menuID, itemID, text)
result = MODIFYMENUFLAGSQQ (menuID, itemID, flag)
result = MODIFYMENUROUTINEQQ (menuIdD, itemID, routine)
result = MODIFYMENUSTRINGQQ (menuID, itemID, text)
result = RUNQQ (filename, commandline)
oldcursor = SETMOUSECURSOR (newcursor)
CALL SETMESSAGEQQ (msg, id)
