Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНЫЕ ПО ФОРТРАНУ №8.DOC
Скачиваний:
86
Добавлен:
03.05.2015
Размер:
421.38 Кб
Скачать

Лабораторная работа № 8 Графические функции и подпрограммы Intel Fortran

  1. Цель работы

Освоить основные методы работы с графическими подпрограммами и функциями, простейшие способы формирования изображений и создания многооконных приложений.

2.Теоретические сведения

В приложениях типа Standard Graphic Application и QuickWin вывод на экран может осуществляться не только в алфавитно-цифровом, но и в графическом режиме. Функции графического вывода позволяют, например, строить графики, создавать трехмерные изображения, имитировать движение и т.п. Это позволяет наглядно моделировать физические процессы и отображать работу физических устройств, что упрощает и ускоряет работу пользователя. Графические операции Фортрана реализованы в виде функций и подпрограмм, их определения находятся в библиотеке IFQWIN1, поэтому, если в программе используются графические операции, библиотека должна быть подключена с помощью команды

Use ifqwin

Эта команда должна находиться сразу после заголовка программной единицы.

В графическом режиме в соответствии с принципами работы растрового дисплея экран рассматривается как система координат, в которой можно управлять состоянием (подсветкой) каждой точки (пикселя) экрана. Пиксель является минимальной адресуемой графической единицей. Построение любого изображения сводится к подсветке отдельных точек экрана. Число точек по горизонтали и вертикали (разрешение) определяется техническими возможностями компьютера (в частности, графическим адаптером). Стандартным является разрешение 640 точек по горизонтали на 480 точек по вертикали. Размер пикселя обычно составляет 0,31–0,21 мм.

Графический вывод выполняется в окне, размеры которого можно менять. По умолчанию окном считается весь экран. Местоположение пикселя на экране можно определить тремя способами, в зависимости от того, какая координатная система применяется. Существует три системы координат (СК): физическая СК, СК порта просмотра и оконная СК.

В физической СК координаты точки – целочисленные положительные значения, начиная с 0 (по умолчанию координата х меняется от 0 до 639, у – от 0 до 479). Позиция текущей точки, в которой выполнялся графический вывод, сохраняется в переменной структурного типа xycoord:

TYPE xycoord

INTEGER(2) xcoord !координата х

INTEGER(2) ycoord !координата у

END TYPE

Примечание. На основе встроенных типов данных можно создавать производные типы данных – структуры или записи. Переменные структурного типа состоят из указанного пользователем набора данных встроенных типов, а также ранее определенных структур.

Для создания структуры применяется оператор TYPE…END TYPE. Формат оператора:

TYPE имя структуры

Тип элемента1 имя элемента [, имя элемента…]

Тип элемента2 имя элемента [, имя элемента…]

. . . .

END TYPE [имя структуры]

Примерами производных типов данных являются используемые графическими функциями структуры xycoord, windowconfig и др.

После объявления производного типа можно создавать переменные и массивы такого типа с помощью оператора

TYPE (имя_струкруры) имя переменной[, имя переменной…]

Обращаться к элементу структуры можно следующим образом:

Имя_структуры%имя_элемента

Имя_структуры.имя_элемента

Если определен массив структур, то обращение к элементу имеет вид:

Имя_массива_структур(номер элемента массива)%имя_элемента

Имя_массива_структур(номер элемента массива).имя_элемента

Присвоить значение можно как отдельному элементу структуры, так и структуре в целом:

Имя_переменной=имя_структурного_типа (список значений элементов)

Элементы структур могут быть операндами арифметических и логических операций, аргументами и результатами функций и т. п.

Н

ачальной точкой физической СК является точка с координатами (0,0), расположенная в верхнем левом углу экрана. Координатах возрастает слева направо, координата у – сверху вниз.

СК порта просмотра (видовая СК) существует в пределах определенной пользователем области, называемой портом. Порт может занимать весь экран или его часть. За пределами порта графический вывод не осуществляется. Координаты порта являются целыми числами. Задать порт можно с помощью подпрограммы SETVIEWPORT. Обращение к подпрограмме:

CALL SETVIEWPORT(x1,y1,x2,y2),

где х1, у1, х2, у2 – физические координаты INTEGER(2) верхнего левого и нижнего правого угла прямоугольной области экрана, в которой организуется порт. Исходной для СК порта является верхняя левая точка.

СК окна существует в пределах видеоокна, размеры и положение которого задаются пользователем. В отличие от физической СК и СК порта, СК окна может работать с координатами типа REAL(8), причем допускаются как положительные, так и отрицательные значения координат.

Если точку отсчета переместить в новую позицию, то можно установить новые пределы изменения координат по х и у. Для этого применяется подпрограмма SETVIEWORG. Обращение к подпрограмме:

CALL SETVIEWORG(xn,yn,pos)

где хn, уn – координаты новой точки отсчета (тип INTEGER(2));

роs – переменная типа xycoord для хранения координат графического вывода.

   Например, если при разрешении экрана 640х480 задать новую исходную точку с координатами (50,100), то координата х будет меняться в пределах 50…+589, у – в пределах 100…+379. Тогда задаваемые координаты будут преобразованы к новой системе отсчета.

Местоположение и размеры графических объектов можно задать с помощью констант, переменных и выражений соответствующего типа (в физической СК и СК порта – INTEGER(2)). Управление координатами возможно через аргументы функций и подпрограмм или через структуру типа xycoord. Чтобы пользоваться элементами этой структуры, в программе нужно создать переменную типа xycoord, после чего установить координаты точки, с которой начнется выполнение следующей операции графического вывода, с помощью подпрограммы MOVETO. Обращение к подпрограмме:

CALL MOVETO(x,y,pos),

где х, у – координаты точки (тип INTEGER(2));

роs – переменная типа xycoord для хранения координат графического вывода.

Задать координаты точки графического вывода можно различными способами, например:

TYPE (xycoord) pos !объявляется переменная типа xycoord

Integer(2) x,y,st

. . . . .

CALL MOVETO(10,10,pos) !задается позиция графического вывода (10,10)

x=20; y=30 !будет проведен отрезок от точки (10,10) до (20,35)

st=LINETO(x,y+5) !аргументами графической функции

!являются целочисленные выражения

pos.xcoord=100 !непосредственное обращение к элементам структуры

pos.ycoord=200 !для установки позиции графического вывода(100,200)

Другим базовым параметром, наряду с координатами, является цвет рисунка. По умолчанию изображение выводится белым цветом на черном фоне, однако это можно изменить с помощью функций задания цвета рисунка

st=SETCOLOR(color)

st1=SETCOLORRGB(color1)

и цвета фона

st=SETBKCOLOR(color)

st1=SETBKCOLORRGB(color1)

где сolor – код цвета рисунка (INTEGER(2)) или фона; color1 – RGB-значение цвета рисунка или фона (INTEGER(4));

st – результат INTEGER(4) (индекс предыдущего цвета рисунка (фона) или 1, если цвет не удалось установить); st1 – RGB-значение предыдущего цвета рисунка или фона (INTEGER(4)).

Код цвета в основной 16-цветной палитре можно задать следующими способами (табл. 1):

Таблица 1. Способы задания цвета

Цвет

Способы задания

Номер

Значение в шестнадцатеричной системе

(для RGB-функций)

Символьная

константа в 16-цветном режиме

Черный

0

#000000

$BLACK

Синий

1

#200000

$BLUE

Зеленый

2

#002000

$GREEN

Голубой

3

#202000

$CYAN

Красный

4

#000020

$RED

Фиолетовый

5

#200020

$MAGENTA

Коричневый

6

#002020

$BROWN

Белый

7

#303030

$WHITE

Серый

8

#202020

$GREY

Светло-синий

9

#3F0000

$LIGHTBLUE

Светло-зеленый

10

#003F00

$LIGHTGREEN

Светло-голубой

11

#3F3F00

$LIGHTCYAN

Светло-красный

12

#00003F

$LIGHTRED

Светло-фиолетовый

13

#3F003F

$LIGHTMAGENTA

Желтый

14

#003F3F

$YELLOW

Ярко-белый

15

#3F3F3F

$BRIGHTWHITE

Значением цвета в палитре RGB является шестнадцатеричное число, которому соответствует определенный номер. Значения и номера цветов составляют палитру. RGB – это обозначение системы задания цвета. Каждый пиксель экрана имеет три точки засветки: красную (R), зеленую (G) и синюю (B). Подсветка этих точек с различной интенсивностью определяет цвет пикселя. В трех байтах описания цвета содержатся сведения об интенсивности каждого цвета. Интенсивность кодируется шестнадцатеричным числом. Поскольку с помощью одного байта можно задать 256 различных значений, число цветов в RGB составляет 2563=16777216.

Значение цвета по составляющим интенсивности можно получить с помощью функции

result=RGBTOINTEGER(r,g,b),

где result –значение цвета (INTEGER(4));

r, g, b – параметры (INTEGER(4)), задающие интенсивность красного, зеленого и синего цвета.

Пример. С помощью закрашенных прямоугольников выводятся оттенки от темно-красного цвета до светло-розового:

use ifqwin

integer(4) r, g, b !составляющие цвета

integer(2) st, x

call integertorgb(#000080,r,g,b) !определение составляющих красного

i=1 !переменная для добавления оттенка

do x=1,600,5 !в цикле меняется координата х

st=setcolorrgb(rgbtointeger(r+i,g,b+i)) !установка нового оттенка цвета

st=rectangle($gfillinterior,x,1,x+5,400) !вывод прямоугольника нового цвета

i=i+1

enddo

end

Любое изображение может быть представлено как совокупность достаточно простых объектов (точек, линий, геометрических фигур), для вывода которых разработаны графические примитивы – функции и подпрограммы:

1. Закраска точки экрана (пикселя) или группы точек заданным цветом.

    1. Закраска указанного пикселя текущим цветом или заданным цветом RGB:

result=SETPIXEL (x, y),

result=SETPIXELRGB(x,y,color),

где х, у – координаты точки (тип зависит от СК – INTEGER(2) или REAL(8));

result – прежний цвет точки (INTEGER(2)) или -1, если функция не выполнена; color – цвет закраски RGB (INTEGER(4)).

    1. Закраска заданным цветом массива точек с указанными координатами:

CALL SETPIXELS (n, x, y, color),

CALL SETPIXELSRGB (n, x, y, color),

где n – число закрашиваемых точек (INTEGER(4));

x, y – массивы, содержащие координаты х и у точек (INTEGER(2));

color – массив индексов цветов (INTEGER(2)).

Пример. Создаются массивы координат точек синусоиды и их цветов. График выводится как набор точек.

Use ifqwin

integer(2) color(1000), x1(1000), y1(1000) ,x

type (xycoord) pos

call setvieworg(200,200,pos) !перенос исходной точки СК

x=-200 !начальное значение координаты х

do i = 1, 1000

x1(i) = x+i !массив 1000 координат х (от -200 до 200)

y1(i) = 200 * sin(3.14/500*i) !массив 1000 координат у (синусоида)

color(i) = mod(i,15)+1 !массив цветов (от 1 до 16)

enddo

call setpixels(1000, x1, y1, color) !закраска точек графика

end

2. Вывод отрезка прямой от текущей графической позиции (содержится в структуре xycoord или wxycoord) до указанной точки:

result=LINETO(x, y),

где х, у – координаты точки (тип зависит от СК – INTEGER(2) или REAL(8));

result – результат выполнения (INTEGER(2)), не равен нулю при успешном завершении.

Пример. Вывод графика функции в виде отрезков, соединяющих соседние точки графика:

use ifqwin

integer(2) st, x

integer(2) x2(20), y2(20) !массивы координат точек графика

type (xycoord) pos !текущая графическая позиция

call setvieworg(320,240,pos) !перенос начала системы отсчета

!в середину экрана

x=-10 !начальное значение координаты х

do i=1,20 !цикл заполнения массивов координат точек

x2(i)=x+i-1; y2(i)=x2(i)**2 !график функции у=х2

enddo

call moveto(x2(1),y2(1),pos) !установка начальной точки графика

do i=2,20

k=lineto(x2(i),y2(i)) !вывод отрезка от предыдущей

!до текущей точки

enddo

end

3. Вывод прямоугольника заданных размеров текущего цвета:

result=RECTANGLE(control,x1,y1,x2,y2),

где х1, у1, х2, у2 – координаты верхней левой и нижней правой вершины прямоугольника (тип зависит от СК – INTEGER(2) или REAL(8));

result – результат (INTEGER(2)), не равен нулю при успешном завершении;

control – параметр закраски, может принимать следующие значения:

  • $GBORDER – для вывода контуров прямоугольника;

  • $GFILLINTERIOR – для закраски прямоугольника текущим цветом.

Пример. Заполнение экрана квадратами разного цвета:

use ifqwin

integer(2) x, y

integer(4) st

st=setcolorrgb(#00FF00) !установка начального цвета

do x=0,560,40 !цикл изменения координат х

do y=0,440,40 !цикл изменения координат у

st=setcolorrgb(getcolorrgb()+2*(x+1)*(y+1)) !новый RGB-цвет

st=rectangle($gfillinterior,x,y,x+40,y+40) !закрашенный

!прямоугольник

enddo

enddo

end

  1. Вывод многоугольника по координатам вершин:

result = POLYGON (control, ppoints, cpoints),

где result – результат (INTEGER(2)), не равен нулю при успешном завершении;

control – параметр закраски, может принимать следующие значения:

  • $GBORDER – для вывода контуров многоугольника;

  • $GFILLINTERIOR – для закраски многоугольника текущим цветом;

рpoints – массив структур xycoord (или wxycoord при работе с оконной СК), задающий координаты вершин многоугольника;

cpoints – число вершин многоугольника INTEGER(2).

Стороны многоугольника проводятся как отрезки между вершинами в порядке перечисления вершин в массиве ppoints.

Пример. Рисование звезды (определяются координаты точек окружностей двух диаметров (внутреннего и внешнего), каждая окружность делится на 5 частей, отрезки проводятся между точками внешней и внутренней окружностей):

use ifqwin

integer(4) st

TYPE (xycoord) poly(11), pos !структуры для хранения координат

call setvieworg(320,240,pos) !начало системы отсчета переносится

!в середину экрана

st=setcolorrgb(#000080) !установка текущего красного цвета

a=3.14/2. !а - угол поворота точки по окружности

do i=0,11,2 ! координаты 11 точек звезды, последняя

!точка совпадает с первой

poly(i+1).xcoord = sin(a)*200 !координаты внешней окружности

!(радиус 400)

poly(i+1).ycoord = cos(a)*200

poly(i+2).xcoord = sin(a+3.14/5.)*100 !координаты внутренней окружности

!(радиус 200)

poly(i+2).ycoord = cos(a+3.14/5.)*100

a=a+2*3.14/5 !угол поворота увеличивается на 72

enddo

st=POLYGON($gfillinterior,poly,11) !вывод прямоугольника по массиву точек

end

  1. Вывод эллипса (окружности):

result=ELLIPSE(control, x1 ,y1, x2, y2),

где х1, у1, х2, у2 – координаты верхней левой и нижней правой точки прямоугольника, в который вписан эллипс (тип зависит от СК – INTEGER(2) или REAL(8));

result – результат (INTEGER(2)), не равен нулю при успешном завершении;

control – параметр закраски, может принимать значения $GBORDER или $GFILLINTERIOR (см. выше).

6. Вывод дуги (дуга является частью эллипса, ограниченной двумя векторами, проведенными из его центра):

result=ARC(x1,y1,x2,y2,x3,y3,x4,y4),

где х1, у1, х2, у2 – координаты верхней левой и нижней правой точки прямоугольника, в который вписан эллипс (тип зависит от СК – INTEGER(2) или REAL(8));

х3, у3, х4, у4 – координаты конечных точек первого и второго ограничивающего вектора (INTEGER(2) или REAL(8));

result – результат (INTEGER(2)), не равен нулю при успешном завершении.

Пример. Вывод концентрических дуг в третьей четверти координатной плоскости:

use ifqwin

integer(2) x,y, st

st=setcolor(14) !установка желтого цвета

x=0; y=0 !координаты центра дуг

do i=1,10 !будет выведено 10 дуг

st=arc(x-10*i,y-10*i,x+10*i,y+10*i,-150,0,0,150) !радиусы дуг

!различаются на 10

enddo

end

7. Вывод сектора круга или эллипса:

result=PIE(control,x1,y1,x2,y2,x3,y3,x4,y4),

где х1, у1, х2, у2, х3, у3, х4, у4, result – см. п.6;

control – параметр закраски, см. пп.4, 5.

Пример. Расходящиеся по кругу лучи в виде закрашенных секторов окружности радиусом 100:

use ifqwin

integer(2) x1,y1,x2,y2 !координаты векторов, ограничивающих секторы

integer(4) st

call setvieworg(320,240,pos) !перенос начала СК в середину экрана

st=setcolorrgb(#00FFFF) !установка текущего желтого цвета

ugol=0 !начальный угол для вычисления координат векторов

do i=1,20

x1=int(sin(ugol)*100); y1=int(cos(ugol)*100)!вектора-радиусы окружности

x2=int(sin(ugol+6.28/50.)*100); y2=int(cos(ugol+6.28/50.)*100)

st=pie($Gfillinterior,-100,-100,100,100,x1,y1,x2,y2) !вывод сектора

ugol=ugol+6.28/20. !изменение угла для перехода к следующей

!паре векторов

enddo

end

8. Изменение стиля линий для функций LINETO, POLYGON и RECTANGLE. По умолчанию эти графические примитивы изображаются непрерывными линиями, однако тип линий можно установить подпрограммой

CALL SETLINESTYLE(mask),

где mask – аргумент (INTEGER(2)), задающий вид линии. mask занимает 2 байта (16 битов); каждый бит в mask устанавливается в 1, если требуется закрасить соответствующую по расположению точку линии, и в 0, если закраска не выполняется. Например, если требуется вывести пунктирную линию, где штрихи имеют длину 5 пикселей, а разрывы – 3, это можно задать двоичным числом 1111100011111000, что соответствует шестнадцатеричному коду #F8F8; сплошной линии (по умолчанию) соответствует код #FFFF. Получить сведения о текущем типе линий можно с помощью функции GETLINESTYLE( ).

Пример. По диагонали экрана располагаются разноцветные квадраты, стороны которых имеют разный тип линий:

use ifqwin

integer(2) x,y,mask,st

st=setcolor(3) !установка начального цвета

mask=#F8F8

call setlinestyle(mask) !установка начального типа линий (mask)

x=0;y=0 !координаты верхней левой вершины первого квадрата

do i=1,10

st=rectangle($gborder,x,y,x+40,y+40) !контур квадрата с длиной

!стороны 40 пикселей

x=x+64; y=y+48 !смещение к вершине следующего квадрата

st=setcolor(getcolor()+1) !код нового цвета на 1 больше предыдущего

call setlinestyle(getlinestyle()-10)!новый стиль закраски вычисляется

enddo !относительно предыдущего

end

  1. Заливка замкнутого контура:

result=FLOODFILL(x, y, border)

result2=FLOODFILLRGB(x, y, border2),

где x, y – аргументы (INETEGER(2)), задающие координаты любой точки внутри заполняемого замкнутого контура (линии контура должны быть одного цвета);

border – аргумент (INTEGER(2)), индекс цвета контура;

border2 – аргумент (INTEGER(4)), RGB-значение цвета контура;

result (INTEGER(2)) и result2 (INTEGER(4)) – результат работы функции, не равен 0 при успешном завершении.

Пример. По горизонтали выводится ряд треугольников, закрашенных разными цветами (цвет контуров треугольников – одинаковый):

use ifqwin

integer(2) x, y, st

type (xycoord) pos

st=setcolor(2) !индекс цвета границы

x=30; y=200 !координаты вершины первого треугольника

do i=1,8 !будет выведено 8 треугольников

call moveto(x,y,pos) !установка вершины треугольника

st=lineto(x-30,y+30) !вывод сторон треугольника

st=lineto(x+30,y+30); st=lineto(x,y)

x=x+60 !смещение к вершине следующего треугольника

enddo

x=30; y=210 !установка точки начала заливки в первом

!треугольнике

do i=1,8 !цикл закраски

st=setcolor(getcolor()+1) !установка цвета заливки (на 1 больше предыдущего)

st=floodfill(x,y,2) !заливка текущим цветом до цвета границы (2)

x=x+60 !смещение начальной точки закраски

enddo

end

10. Установка шаблона заливки. По умолчанию закраска замкнутых контуров выполняется сплошным цветом, т. е. закрашивается каждый пиксель внутри контура. Для изменения шаблона заливки создается массив из 8 байтов, представляющий шаблон экрана 8х8 пикселей. Если бит установлен в 1, соответствующая по расположению точка будет закрашена текущим цветом, иначе – нет.

Пример кодирования шаблона:

Для установки нового шаблона закраски используется подпрограмма

CALL SETFILLMASK(mask),

где mask – массив из 8 байтов (INTEGER(1)), задающий шаблон.

Пример. Два прямоугольника закрашиваются с использованием разных шаблонов (сетка и штриховка):

use ifqwin

integer(1) mask1(8)

mask1=(/129,66,36,24,24,36,66,129/) !шаблон-сетка в десятичном коде

call setfillmask(mask1) !установка шаблона-сетки

st=rectangle($gfillinterior,10,10,100,100)!вывод закрашенного прямоугольника

!(сетка)

mask1=(/2#00000001,2#00000010,2#00000100,2#00001000,& !шаблон-штриховка

2#00010000,2#00100000,2#01000000,2#10000000/) !в двоичном коде

call setfillmask(mask1) !установка шаблона-прямоугольника

st=rectangle($gfillinterior,100,100,210,210) !вывод заштрихованного

!прямоугольника

end

11. Очистка экрана и заполнение текущим цветом фона2:

CALL CLEARSCREEN (area),

где area – аргумент, определяющий область очистки:

  • $GCLEARSCREEN – экран очищается полностью;

  • $GVIEWPORT – очистка текущего порта;

  • $GWINDOW – очистка текущего текстового окна.

Кроме перечисленных функций, Intel Fortran позволяет: проводить кривые Безье через массив точек (POLYBEZIER), выводить полилинии, т.е. множество отрезков между заданными точками (POLYLINEQQ), управлять режимом видимости курсора (DISPLAYCURSOR) и т.д.

Вывод текста в графических проектах возможен в текстовом режиме (без управления шрифтом) и графическом (с возможностью управления характеристиками шрифта).

Такие операторы как WRITE или PRINT позволяют выводить текст в алфавитно-цифровом режиме3, когда экран представляет собой «сетку», в каждой ячейке которой можно разместить один печатный символ (буква, цифра, знак препинания и т. д.). Количество строк и символов в строке определяется системными характеристиками (например, 25 строк по 80 символов), как и вид шрифта.

В текстовом режиме для вывода текста используется подпрограмма OUTTEXT. Для работы с текстом создается текстовое окно. По умолчанию это окно занимает весь экран. Текстовое окно создается с помощью подпрограммы

CALL SETTEXTWINDOW(x1,y1,x2,y2),

где х1, у1, х2, у2 – координаты верхнего левого и нижнего правого угла текстового окна (задаются как номера строк и столбцов).

В текстовом окне применяется координатная система, в которой экран делится на строки и столбцы (колонки). Строки и столбцы нумеруются, начиная с 1. При указании местоположения текста на экране сначала задается номер строки, затем номер столбца. Позиция выводимого текста хранится в переменной типа rccoord:

TYPE rccoord

INTEGER(2) row ! номер строки

INTEGER(2) col ! номер столбца

END TYPE rccoord

Установка позиции текста в текстовом окне выполняется с помощью подпрограммы

CALL SETTEXTPOSITION (row, column, t),

где row – аргумент INTEGER(2), задает номер строки;

сolumn – аргумент INTEGER(2), задает номер столбца;

t – результат, структура rccoord, содержит предыдущую текстовую позицию.

Подпрограмма OUTTEXT позволяет выводить текст в графических приложениях в текстовом режиме:

CALL OUTTEXT(string),

где string – аргумент типа CHARACTER*(*) (или текстовая константа).

Цвет текста можно установить4 по

result = SETTEXTCOLOR (index),

где index – аргумент типа INTEGER(2), задает индекс цвета,

result – результат типа INTEGER(2), сохраняет прежний индекс цвета.

По умолчанию текст выводится белым цветом (индекс 15). Установить цвет фона позволяет функция SETBKCOLOR (см. выше).

Пример:

USE IFQWIN

INTEGER(2) color ! цвет текста

INTEGER(4) fon ! цвет фона

TYPE (rccoord) pos ! позиция текста

CALL SETTEXTWINDOW (INT2(1), INT2(1),INT2(20), INT2(75)) !текстовое окно

CALL SETTEXTPOSITION(INT2(1), INT2(1), pos)! текст – в 1 строку, 1 столбец

CALL OUTTEXT('белый текст на черном фоне') ! вывод текста

CALL SETTEXTPOSITION(INT2(5), INT2(1), pos)! текст – в 5 строку, 1 столбец

fon=setbkcolor(2) ! цвет фона - зеленый

color=settextcolor(4) ! цвет текста - красный

! вывод данных о прежнем цвете фона и текста

write (*,*) ' Был фон: ', fon, ' был цвет: ', color

END

Чтобы иметь возможность работать со шрифтами, их нужно инициализировать (организовать в памяти список всех установленных в системе шрифтов), а затем выбрать какой-либо определенный шрифт и задать его характеристики. Этот шрифт станет текущим, и именно таким образом будут выводиться символы, пока текущий шрифт не будет изменен. Для работы со шрифтами не применяются никакие функции, работающие в текстовых окнах.

Инициализация шрифта выполняется функцией

result= INITIALIZEFONTS(),

где result – результат типа INTEGER(2), равен количеству инициализированных шрифтов.

Установить текущий шрифт и его характеристики позволяет функция

result=SETFONT(options)

где options – строка (аргумент типа CHARACTER*(*)), задающая характеристики шрифта;

result – результат (INTEGER(2)), равен номеру шрифта, если такой шрифт можно установить, иначе 1.

Строка options может содержать следующие символы и значения:

  • t 'fontname' – здесь fontname – название шрифта, например t'Arial';

  • hy – высота символа (у) в пикселах, например, h24;

  • wx – ширина символа (х) в пикселах, например, w18;

  • e – стиль шрифта bold (жирный);

  • u – стиль шрифта underline (подчеркнутый);

  • i – стиль шрифта italic (наклонный);

  • b – подбор шрифта, соответствующего указанным характеристикам.

Цветом и расположением текста можно управлять с помощью графических примитивов MOVETO и SETCOLOR. В графическом режиме можно задать также и угол, под которым будет выведен текст, с помощью подпрограммы

CALL SETGTEXTROTATION(degrees),

где degrees – аргумент (INTEGER(4)), задает угол поворота текста, умноженный на 10. Например, угол в 45 можно задать так:

CALL SETGTEXTROTATION(450)

Если угол поворота не задан, текст выводится в горизонтальном направлении слева направо (что соответствует наклону в 0).

Вывод текста с использованием текущего шрифта можно выполнить только с помощью подпрограммы

CALL OUTGTEXT(string),

где string имеет тип CHARACTER*(*) или представляет собой символьную константу.

Пример. По экрану по диагонали перемещается надпись «ТЕХТ»:

USE IFQWIN

TYPE (xycoord) posgr !позиция графического вывода

INTEGER(2) x,y !координаты начальной точки вывода

numfonts = INITIALIZEFONTS() !инициализация шрифтов

x=10; y=10 !начальная позиция вывода

fontnum = SETFONT('t''Arial''h28w16') !характеристики шрифта

do i=1,100 !цикл перемещения надписи

st=setcolor(12) !цвет надписи

call moveto(x,y,posgr) !позиция вывода надписи

call outgtext('ТЕХТ') !вывод "ТЕХТ"

call moveto(x,y,posgr) !возврат к начальной позиции вывода

call sleepqq(20) !пауза

st=setcolor(getbkcolor()) !установка для текста цвета фона

call outgtext('ТЕХТ') !вывод той же надписи цветом фона (стирание)

x=x+8; y=y+8 !сдвиг по диагонали позиции вывода текста

enddo

end

В Фортране предусмотрены возможности работы с реальными координатами (вещественные значения, в том числе и отрицательные). Для этого создаются видеоокна (не путать с окнами приложений Windows, снабженными меню и средствами управления окном).

Окно представляет собой часть экрана с заданными свойствами, в пределах которого осуществляется графический вывод. Чтобы стандартные графические функции могли работать с окном, при обращении к ним добавляется окончание _W, например, LINETO_W. Тогда указанные при вызове функции координаты преобразуются таким образом, чтобы изображение помещалось внутри окна. По умолчанию размеры окна совпадают с размерами экрана. Структура окна хранится в переменной производного типа windowconfig, состоящей из следующих элементов:

TYPE windowconfig

INTEGER(2) numxpixels ! ширина окна в пикселях

INTEGER(2) numypixels ! высота окна в пикселях

INTEGER(2) numtextcols ! максимальное число символов в строке

INTEGER(2) numtextrows ! максимальное число строк

INTEGER(2) numcolors ! число цветов

INTEGER(4) fontsize ! размер стандартного шрифта

CHARACTER(80) title ! заголовок окна

INTEGER(2) bitsperpixel ! системное число битов на пиксель

! следующие три элемента нужны для работы с многобайтными символами

! (например, коды иероглифов)

CHARACTER(32) extendfontname

INTEGER(4) extendfontsize

INTEGER(4) extendfontattributes

END TYPE windowconfig

Стандартные характеристики окна: 640х480 пикселей, 80х30 символов, шрифт Courier New 8х16 пикселей, заголовок окна “Graphic1”.

Координаты текущей обрабатываемой точки окна (оконные координаты) хранятся в переменной производного типа wxycoord:

TYPE wxycoord

REAL(8) wx ! координата x

REAL(8) wy ! координата y

END TYPE wxycoord

Чтобы начать работу с окном, нужно выполнить следующие действия:

1. Установить характеристики окна по SETWINDOWCONFIG;

2. Создать порт (если окно не занимает весь экран) по SETVIEWPORT;

3. Задать ограничения для координат окна по SETWINDOW.

Затем можно нарисовать рамки окна с помощью RECTANGLE_W и т.п.

Рассмотрим эти функции подробнее:

1. Изменение5 стандартных характеристик окна:

result = SETWINDOWCONFIG (wc),

где wc – аргумент производного типа windowconfig;

result – результат LOGICAL(4), равен .TRUE. при успешном завершении, иначе .FALSE. (если заданные значения нельзя установить).

Если всем элементам windowconfig присвоить значения -1, можно получить максимально возможные характеристики окна, допускаемые системой. Без обращения к SETWINDOWCONFIG устанавливаются стандартные характеристики (см. выше).

2. Определение области вывода – порта просмотра (подпрограмма):

CALL SETVIEWPORT (x1, y1, x2, y2),

где x1, y1 – аргументы INTEGER(2), физические координаты верхнего левого угла порта (в пикселях); x2, y2 – аргументы INTEGER(2), физические координаты нижнего правого угла порта.

После установки порта SETWINDOW и прочие функции, работающие с окном, будут действовать в пределах ограниченной портом части экрана.

3. Установка предельных значений координат окна.

Для работы с реальными координатами (например, при построении графика функции) выполняется масштабирование, т.е. система получает сведения о предельных значениях реальных координат (например, максимальные и минимальные значения аргумента и функции), и приводит все координаты при выводе изображения в видеоокне в соответствии с размерами окна в пикселях и заданными предельными значениями. Для этого используется функция:

result = SETWINDOW (finvert, wx1, wy1, wx2, wy2),

где finvert – аргумент LOGICAL(2), задает направление возрастания координаты у. Если finvert= .TRUE., у возрастает снизу вверх (декартова система координат), если finvert=.FALSE., y возрастает сверху вниз (система координат экрана);

wx1, wy1 – аргументы REAL(8), предельные значения координат для верхнего левого угла окна;

wx2, wy2 – аргументы REAL(8), предельные значения координат для нижнего правого угла окна;

result – результат INTEGER(2), не равен 0 при успешном выполнении функции.

О

Рис. 1

дна из наиболее часто решаемых графических задач –вывод графиков заданных функций. Существует много алгоритмов решения таких задач; рассмотрим один из них (рис. 1). В данном случае график создается как ломаная линия, отрезки которой проводятся между точками графика с заданными координатами; чем больше известно координат точек, тем более плавной будет линия графика.

Пример. В верхней правой и верхней левой частях экрана создаются два окна. В первом окне выводится график параметрической функции

во втором окне – график функции

Во втором окне на график наносится координатная сетка.

use IFQWIN

INTEGER(2) st, h,w

INTEGER(2) cols, rows

TYPE (windowconfig) scr

type (rccoord) tp

real(8) x(100),y(100),hx,hy

type (wxycoord) wc

st=getwindowconfig(scr) ! получение характеристик окна

w = scr.numxpixels ! ширина окна

h = scr.numypixels ! высота окна

cols = scr.numtextcols ! число колонок текста в окне

rows = scr.numtextrows ! число строк текста в окне

! создание первого окна

st=setcolor(12)

CALL SETVIEWPORT(INT2(0), INT2(0), w/2-1, h/2-1) !портверхняя

!левая четверть экрана

CALL SETTEXTWINDOW(INT2(1), INT2(1), rows/2, cols/2 ) !текстовое окно

st = RECTANGLE( $GBORDER,INT2(0),INT2(0),w/2-1,h/2-1) ! рамка окна

! заполнение массива координат точек графика (100 точек)

i=1

do t=0.0628,6.28,0.0628 ! аргумент – угол, меняется от 0 до 2

x(i)=38*cos(t)+7*cos(19*t); y(i)=38*sin(t)-7*sin(19*t)

i=i+1

enddo

! задание граничных значений координат (через встроенные функции определения

! минимального и максимального значений массивов) и направления изменения координаты у

st = SETWINDOW( .ТRUE., minval(x),minval(y),maxval(x),maxval(y))

! вывод графика в виде ряда отрезков

call moveto_w(x(1),y(1),wc) ! установка начальной точки графика

do i=2,100

st=lineto_w(x(i),y(i))

enddo

call settextposition(2,2,tp) ! определение положения строки текста в окне

call outtext("Window 1") ! вывод надписи

st=setcolor(14)

! создание второго окна

CALL SETVIEWPORT(w/2,0,w, h/2)! установка порта в правой верхней части окна

CALL SETTEXTWINDOW(1,cols/2+1,rows/2,cols)! установка нового текстового окна

st = RECTANGLE( $GBORDER,0,0,w/2-1,h/2-1) ! рамка окна

! заполнение массива координат точек графика

i=1

do t=0.0628,6.28,0.0628

x(i)=10*(sin(2*t)+cos(t)); y(i)=10*(20+10*(cos(2*t)+sin(t))); i=i+1

enddo

! задание граничных значений координат

st=SETWINDOW(.FALSE., 3*minval(x),3*minval(y),3*maxval(x),3*maxval(y))

! вывод графика

call moveto_w(x(1),y(1),wc)

do i=2,100

st=lineto_w(x(i),y(i))

enddo

call settextposition(rows/2-2,3,tp) ! вывод текста

call outtext("Window 2")

! нанесение сетки на график (по 20 линий по х и у)

! определение шага линий сетки по х и у

hx=(abs(3*minval(x))+abs(3*maxval(x)))/20.

hy=(abs(3*minval(y))+abs(3*maxval(y)))/20.

st=setcolor(15) ! цвет сетки – белый

call setlinestyle(#00F0) ! линии сетки – пунктирные

! цикл рисования линий сетки

do i=1,20

call moveto_w(3*minval(x),3*minval(y)+i*hy,wc) ! горизонтальные линии

st=lineto_w(3*maxval(x),3*minval(y)+i*hy)

call moveto_w(3*minval(x)+hx*i,3*minval(y),wc) ! вертикальные линии

st=lineto_w(3*minval(x)+i*hx,3*maxval(y))

enddo

! рисование осей Х и Y

st=setcolor(2) ! цвет осей

call setlinestyle(#FFFF) ! линии осей - сплошные

call moveto_w(0.,3*minval(y),wc) ! ось Y

st=lineto_w(0.,3*maxval(y))

call moveto_w( 3*minval(x),0.,wc) ! ось Х

st=lineto_w(3*maxval(x),0.)

end

Анимация представляет собой достаточно быструю смену незначительно отличающихся друг от друга кадров. Чем больше кадров и чем меньше степень их отличия друг от друга, тем более точным и реальным выглядит «движущееся» изображение. При этом изображение может быть создано непосредственно в кадре или построено заранее и сохранено в оперативной или внешней памяти. Существует множество подходов к созданию движущегося изображения, например:

  • изображение строится постепенно, т.е. сначала появляется часть его, затем, после паузы, следующая часть и т.д.; между этапами построения экран не очищается (пример – замедленный вывод графика по точкам);

  • предварительно созданное изображение (кадр) после вывода на экран находится на нем достаточно малый период времени (до нескольких десятков миллисекунд), затем экран очищается и заполняется другим изображением;

  • новое изображение размещается на экране так, чтобы не изменялось предыдущее (т.е. появляется на фоне предыдущего), затем после паузы восстанавливается исходный вид фона, а заданное изображение появляется уже в другом месте экрана.

Для реализации этих алгоритмов можно воспользоваться следующими функциями.

1. Сохранение изображения в оперативной памяти:

CALL GETIMAGE(x1,y1,x2,y2,buffer),

где х1, у1, х2, у2 – координаты верхнего левого и нижнего правого угла прямоугольника, ограничивающего сохраняемую область экрана;

buffer – массив байтов (INTEGER(1)), размер которого достаточен для хранения изображения (одна точка изображения – один байт).

Чтобы узнать, сколько байтов потребуется для хранения изображения указанных размеров, используется функция

result=IMAGESIZE(x1,y1,x2,y2),

где х1, у1, х2, у2 – координаты верхнего левого и нижнего правого угла прямоугольника, внутри которого находится сохраняемое изображение;

rezult – результат INTEGER(4), число байтов, необходимых для хранения изображения.

Когда размеры массива-буфера известны, память под него можно выделить с помощью команды ALLOCATE (имя_массива(размерность массива)), а сам массив должен быть объявлен с параметром ALLOCATABLE.

2. Загрузка и размещение в окне сохраненного в буфере изображения:

СALL PUTIMAGE(x,y,buffer,action),

где х, у – координаты верхней левой вершины прямоугольника, в пределах которого будет размещено содержимое буфера хранения;

buffer – имя массива, содержащего изображение;

action – тип взаимодействия уже имеющегося на экране изображения с загружаемым (вид логической операции, выполняемой поразрядно над байтами (пикселями) этих двух изображений, совпадающими по расположению на экране):

  • $GAND – над двоичными кодами, определяющими цвет точек имеющегося и загружаемого изображений, выполняется операция логического умножения, т.е. сохраняются неизменными только точки, совпадающие по цвету);

  • $GOR – над кодами изображений выполняется логические сложение;

  • $GPRESET – прежнее изображение заменяется инвертированным содержимым буфера;

  • $GPSET – прежнее изображение заменяется содержимым буфера;

  • $GXOR – коды цвета совпадающих по расположению пикселей складываются по модулю 2 (исключающее ИЛИ). Если образ загрузить при таком способе взаимодействия дважды, то прежнее изображение восстановится (используется в анимации для организации движения объекта на неизменном фоне).

Все приведенные выше функции и подпрограммы работают как с физическими, так и с оконными координатами.

Пример: круг движется по синусоиде, оставляя «след».

use IFQWIN

integer(1),allocatable::image1(:) ! буфер для хранения изображения

type (wxycoord) pos ! текущая графическая позиция окна

real(8) x,y ! оконные координаты объекта

ii=setwindow(.true.,-100d0,-100d0,100d0,100d0) ! организация окна

ii=setcolorRGB(#00DDAA) ! создание исходного изображения

ii=ellipse_w($gfillinterior,5D0, 5D0, 10D0, 10D0)

is1=imagesize_w(5d0,5d0,10d0,10d0) ! определение размера буфера

allocate(image1(is1)) ! выделение памяти под массив

call getimage_w(5d0,5d0,10d0,10d0,image1) ! сохранение изображения

call clearscreen($GCLEARSCREEN)

call moveto_w(-100d0,sin(-100d0),pos)! установка начальной позиции вывода

do x=-100d0,100d0,0.1d0 ! цикл движения

y=20*sin(x) ! вычисление координат траектории

st=lineto_w(x,y) ! рисование следа (графика)

call putimage_w(x,y,image1,$gxor) ! загрузка изображения

call sleepqq(5) ! пауза

call putimage_w(x,y,image1,$gxor)! повторная загрузка (для стирания)

call sleepqq(5)

enddo

end

3. Сохранение изображения в файле (во внешней памяти):

result=SАVEIMAGE(filename,x1,y1,x2,y2),

где filename – полное имя файла, в котором сохраняется изображение; тип файла – ВМР (точечный);

х1, у1, х1, у2 – координаты верхнего левого и нижнего правого угла прямоугольника, ограничивающего сохраняемую область экрана.

4. Загрузка изображения из файла на экран:

result=LOADIMАGE(filename,x,y),

где х, у – координаты верхнего левого угла прямоугольника, в пределах которого на экране будет размещен загружаемый файл;

filename – полное имя загружаемого файла.

Можно загружать не только файлы, сохраненные по SAVEIMAGE, но и любые файлы типа ВМР, созданные средствами графических редакторов. Главное требование к загружаемому изображению – оно не должно выходить за пределы окна (экрана), иначе загрузка не будет выполнена.

Пример: в файлах хранятся два рисунка, содержащие этапы движения:

файл 'd:\cat1.bmp' файл 'd:\cat2.bmp'

В цикле происходит поочередная загрузка этих файлов на экран, так что создается впечатление движения «хвоста»:

USE IFQWIN

LOGICAL(4) result

TYPE (qwinfo) winfo1

winfo1.TYPE = QWIN$MAX ! задание максимальных размеров окна

winfo1.x=0; winfo1.y=0 ! координаты окна

winfo1.h=480; winfo1.w=640

result = SETWSIZEQQ(QWIN$FRAMEWINDOW, winfo1) ! установка основного окна

do i=1,50

st=LOADIMAGE_W('d:\cat1.bmp',1d0,1d0) ! загрузка первого файла

call sleepqq(10) ! пауза 10 млс

st=LOADIMAGE_W('d:\cat2.bmp',1d0,1d0) ! загрузка второго файла

call sleepqq(10) ! пауза 10 млс

enddo

end

QuickWin-приложения – это многооконные проекты, которые не только могут работать с графическими функциями в вещественных координатах, текстовыми окнами, разнообразными шрифтами, как приложения Standard Graphics, но и со стандартными меню Windows (File, Edit, Help и т.д.), собственными меню пользователя, мышью. Каждое QuickWin-приложение создает собственное окно6; кроме того, можно открывать дочерние окна (до 40). В окнах приложений QuickWin можно выполнять выбор, копирование и вставку текстовой и графической информации, открывать дочерние окна и работать с ними, переключаться между окнами, менять их размеры и выполнять другие действия, характерные для Windows-приложений.

Работа с меню. Меню – это список функций, которые может выполнять данная программа. Функции выбираются с помощью мыши или «горячих клавиш». Стандартными меню для QuickWin-приложений являются: File (пункты меню: Print, Save, Exit), Edit (пункты: Select Text, Select Graphics, Select All, Copy, Paste), View (Size to Fit, Full Screen), State (Pause), Window (Cascade, Tile, Arrange Icons, Input, Clear Paste, Status Bar), Help (Contents, Using Help, About). Они появляются автоматически при запуске QuickWin-приложения. Однако пользователь может изменить стандартные меню и их пункты или построить собственные меню. Для этого служит функция инициализации QuickWin INITIALSETTINGS.

Для определения местоположения объекта меню принято нумеровать, начиная с 1, слева направо, а пункты – сверху вниз, начиная c 0. Если требуется видоизменить стандартное меню, пользователь должен написать собственную функцию INITIALSETTINGS и установить интерфейс с ней в головной программе. Если для работы достаточно стандартных меню, этого можно не делать.

Пример программы с изменением стандартного меню:

PROGRAM MENUS

USE IFQWIN

LOGICAL(4) res ! переменная для хранения результатов INITIALSETTINGS

INTERFACE ! интерфейс с функцией пользователя INITIALSETTINGS

LOGICAL(4) FUNCTION INITIALSETTINGS

END FUNCTION

integer*2 st ! переменная для хранения результатов графических функций

res=INITIALSETTINGS() ! обращение к функции INITIALSETTINGS

write (*,*) 'window 1' ! в главном окне приложения выводится текст

st=rectangle_w($gborder,20,20,50,50)! в окне рисуется прямоугольник

end

! функция задания размеров окна и изменений в меню

LOGICAL(4) FUNCTION INITIALSETTINGS()

USE MSFLIB

LOGICAL(4) result

TYPE (qwinfo) qwi ! структура, содержащая параметры окна приложения

qwi.x = 0 ! координаты верхнего левого угла окна по Х и Y

qwi.y = 0

qwi.w = 640 ! размеры окна приложения 640х480 пикселей

qwi.h = 480

qwi.type = QWIN$SET ! подтвердить указанные размеры

i = SetWSizeQQ(QWIN$FRAMEWINDOW, qwi) ! установить размеры окна

! вставить в меню 3 (View) пункт 3 (New Item Inserted) без подпрограммы

! обработки

result = INSERTMENUQQ(3,3,$MENUENABLED,'New Item Inserted'C,NUL)

! добавить к меню 3 (View) последним пунктом New Item Appended

result = APPENDMENUQQ(3, $MENUENABLED,' New Item Appended'C, NUL)

! создать меню 7 (New menu) c подпрограммой обработки WINEXIT (завершение

! работы приложения) и горячими клавишами для вызова Alt+N

result = APPENDMENUQQ(7, $MENUENABLED, 'N&ew Menu'C, WINEXIT )

! нарисовать разделитель в 7 меню

result = APPENDMENUQQ(7, $MENUSEPARATOR, ''C, NUL )

INITIALSETTINGS= .true.

END FUNCTION INITIALSETTINGS

Для изменения меню используются следующие функции.

Уничтожение пункта меню:

result = DELETEMENUQQ (menuID, itemID),

где menuID – номер меню (INTEGER(4));

itemID – номер пункта меню (INTEGER(4));

result – LOGICAL(4) (равен .TRUE. при успешном завершении, иначе .FALSE.).

Вставка пункта или меню:

result = INSERTMENUQQ (menuID, itemID, flag, text, routine),

где menuID – номер меню (INTEGER(4)); если меню вставляется между уже существующими, то номера находящихся правее меню увеличиваются на 1;

itemID – номер пункта меню (INTEGER(4)); если задается пункт меню с номером 0, он становится заголовком меню, подпрограмма обработки для которого не устанавливается; если пункт вставляется между уже существующими пунктами, то номера находящихся ниже пунктов увеличиваются на 1;

flag – константа, обозначающая состояние пункта. Флаги можно объединять по OR. Значения флагов: $MENUGRAYED (запретить пункт и закрасить его серым цветом); $MENUENABLED (разрешить пункт); $MENUCHECKED (пометить пункт как выбранный); $MENUUNCHECKED (снять пометку); WINPRINT (печать содержимого окна); WINSAVE (сохранение содержимого окна); WINEXIT (завершение работы программы); WINSELTEXT (выбрать текст в текущем окне); WINCOPY (копировать выбранный текст или графику в буфер); NUL (пункт не имеет подпрограммы обработки) и др.

Кроме того, можно менять состояние пунктов (MODIFYMENUFLAGSQQ (menuID, itemID, flag.)), устанавливать подпрограмму, запускаемую при обращении к пункту меню (MODIFYMENUROUTINEQQ (menuIdD, itemID, routine)), добавлять пункты в меню (APPENDMENUQQ (menuID, flags, text, routine)) и т.д.

Для того чтобы подпрограмму пользователя можно было применять для вызова из меню (при обращении к пункту), она должна быть объявлена в INITIALIZESETTINGS как внешняя (EXTERNAL).

Пример: создается меню из единственного пункта "RIS", при обращении к которому в окне-потомке будет нарисован круг:

use msflib ! головная программа (в данном случае содержит только

INTERFACE ! интерфейс с INITIALIZESETTINGS)

LOGICAL(4) FUNCTION INITIALSETTINGS

END FUNCTION

END INTERFACE

end

LOGICAL(4) FUNCTION INITIALSETTINGS() !задание параметров окна и меню

USE MSFLIB

external RIS ! внешняя программа обработки RIS

LOGICAL(4) result

TYPE (qwinfo) qwi ! параметры окна приложения (верхний угол, размеры)

qwi.x = 0; qwi.y = 0; qwi.w = 640; qwi.h = 480

qwi.type = QWIN$SET !параметр, задающий поведение окна

i = SetWSizeQQ( QWIN$FRAMEWINDOW, qwi )

! создается первое меню (FIRST MENU)

result = APPENDMENUQQ(1, $MENUENABLED, '&FIRST MENU'C, NUL )

! в меню 1 добавляется новый пункт с подпрограммой обработки RIS

result = APPENDMENUQQ(1,$MENUENABLED,'New Item'C, RIS)

INITIALSETTINGS= .true.

END FUNCTION INITIALSETTINGS

subroutine RIS(checked) ! подпрограмма обработки пункта меню New Item

use msflib

logical(4) checked ! обязательный логический параметр подпрограммы

integer(2)st

st=setcolor(14)

checked=.true. ! установка логического параметра при выборе пункта

st=ellipse_w($gborder,1,1,50,50) ! вывод эллипса

return

end

Сообщения для пользователя. Пользователь может задать текст сообщения, которое появится на экране, если в стандартном меню Help будет выбран пункт About, с помощью команды

result = ABOUTBOXQQ (cstring),

где cstring – текст сообщения, Character*(*), строка с нулевым окончанием;

result – результат, INTEGER(4), равен 0 при успешном выполнении команды.

По команде MESSAGEBOXQQ можно вывести на экран сообщение-запрос для пользователя. Формат команды:

result = MESSAGEBOXQQ (msg, caption, mtype),

где msg – текст сообщения (с окончанием 'С);

caption – текст заголовка для диалогового окна (с окончанием 'С);

mtype – символьная константа, задающая объекты в окне сообщения (константы можно объединять по OR). Примеры констант: MB$ABORTRETRYIGNORE – вывести кнопки Abort, Retry, Ignore; MB$OK – вывести кнопку OK; MB$OKCANCEL – вывести кнопки OK и Cancel; MB$YESNO – вывести кнопки Yes и No; MB$YESNOCANCEL – вывести кнопки Yes, No, Cancel.

Результатом являются константы, обозначающие ответ пользователя на запрос диалога: MB$IDABORT – нажата кнопка Abort; MB$IDCANCEL – нажата кнопка Cancel; MB$IDIGNORE – нажата кнопка Ignore; MB$IDNO – нажата кнопка No; MB$IDOK – нажата кнопка OK; MB$IDRETRY – нажата кнопка Retry; MB$IDYES – нажата кнопка Yes.

Пример:

! появляется окно с заголовком "Диалог" и запросом "Закончить работу?"

! если будет нажата кнопка "YES", программа закончится выводом надписи "YES"

message = MESSAGEBOXQQ('Закончить работу?'C, 'Диалог'C, MB$YESNO)

if (message==MB$IDYES) stop 'YES'

Работа с мышью. QuickWin-приложения могут реагировать на события, связанные с использованием манипулятора «мышь». Можно определить, какие действия будут выполняться при нажатии или отпускании кнопок мыши, при ее движении (это называется событиями мыши).

Функция регистрации подпрограммы обработки события:

result = REGISTERMOUSEEVENT (unit, mouseevents, callbackroutine),

где unit – номер окна, в котором должно произойти событие;

mouseevents – одно или более событий, запускающих подпрограмму:

  • MOUSE$LBUTTONDOWN – была нажата левая кнопка мыши;

  • MOUSE$LBUTTONUP – левая кнопка отпущена;

  • MOUSE$LBUTTONDBLCLK – левая кнопка нажата дважды;

  • MOUSE$RBUTTONDOWN – правая кнопка нажата;

  • MOUSE$RBUTTONUP – правая кнопка отпущена;

  • MOUSE$RBUTTONDBLCLK – правая кнопка нажата дважды;

  • MOUSE$MOVE – мышь двигалась;

сallbackroutine – подпрограмма обработки события, EXTERNAL;

result – (INTEGER(4)) – результат обработки события, равен 0 при успешном завершении и отрицательному числу в случае ошибки.

Задержка выполнения программы до указанного события мыши:

result = WAITONMOUSEEVENT (mouseevents, keystate, x, y),

где mouseevents – одно или несколько ожидаемых событий, заданные символьными константами (см. выше);

keystate – результат, символьная константа, показывающая, какие события произошли одновременно с ожидаемым:

  • MOUSE$KS_LBUTTON – была нажата левая кнопка мыши;

  • MOUSE$KS_RBUTTON – была нажата правая кнопка мыши;

  • MOUSE$KS_SHIFT – была нажата клавиша SHIFT;

  • MOUSE$KS_CONTROL – была нажата клавиша CТRL.

х – результат (INTEGER(4)), значение координаты х мыши во время события;

y – результат (INTEGER(4)), значение координаты у мыши во время события.

result – результат, равен 0 при успешном завершении.

Пример:

use msflib

external obr ! внешняя подпрограмма обработки события мыши

! зарегистрировать подпрограмму, выполняемую в главном окне

! при нажатии левой кнопки мыши

result = REGISTERMOUSEEVENT (0, MOUSE$LBUTTONDOWN, obr)

! ожидать нажатия левой кнопки мыши

result = WAITONMOUSEEVENT (MOUSE$LBUTTONDOWN, keystate, ix, iy)

write (*,*) 'Xmouse=',ix ! вывод координат мыши по х и у при нажатии

write (*,*) 'Ymouse=',iy ! левой кнопки

end

! подпрограмма, выполняемая при нажатии левой кнопки мыши

SUBROUTINE obr

write (*,*) 'MOUSE EVENT'

END SUBROUTINE