Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 6. Округление значений параметров
dummy=lineto_w(x1,y1)
dummy=lineto_w(x2,y2)
dummy=lineto_w(xk,yk)
return
end
61
Впримере 6 показаны приемы округления значений параметра, при-
чем способ округления устанавливается по закону, заданному программистом. Если обычно при округлении отбрасываются младшие разряды
числа (например, 1.4 округляется до 1.0), то программист сам может изменить этот порядок (например, 1.4 округляется до 1.5, а1.3 округляется
до 1.0).
Пример 6. Округление значений параметров
subroutineschag8(dx)
implicitreal*8(a-h,o-z)
character(9)nle8
character(3)index
character(1)simwol(9)
equivalence(simwol(1),nle8),(simwol(7),index)
cОкруглениешагаdx
30format(i3)
31format(g5.1)
32format(g9.1)
39format(9a1)
write(nle8,32)dx
read(nle8,39)simwol
read(nle8,31)dx0
dx=dx0
if(dx0.le.500.0d0)dx=500.0d0
if(dx0.le.200.0d0)dx=200.0d0
if(dx0.le.100.0d0)dx=100.0d0
if(dx0.le.50.0d0)dx=50.0d0

62 Глава 2. Обработка графической информации
if(dx0.le.20.0d0)dx=20.0d0
if(dx0.le.10.0d0)dx=10.0d0
if(dx0.le.5.0d0)dx=5.0d0
if(dx0.le.2.0d0)dx=2.0d0
if(dx0.le.1.0d0)dx=1.0d0
if(dx0.le.0.5d0)dx=0.5d0
if(dx0.le.0.2d0)dx=0.2d0
if(dx0.le.0.1d0)dx=0.1d0
if(dx0.le.0.05d0)dx=0.05d0
if(dx0.le.0.02d0)dx=0.02d0
if(dx0.le.0.01d0)dx=0.01d0
read(index,30)ind
des=10.0d0
dx=dx*des**ind
if(dx.le.0.0d0)dx=1.0d0
return
end
Легко видеть, что можно предложить более компактные формы записи текста этой подпрограммы.
Пример 7. Выполнение функций
под управлением кнопок мыши
cПроверяемсостояниекнопокмыши(Mouse)
subroutinesubmous
*(unit1,melm,xmin,xmax,ymin,ymax,ix2,iy2)
usedib
externalsubln
externalsublo
externalsubrn
externalsubro
integer*4melmmm,melm

Пример 7. Выполнение функций подуправлением кнопок мыши
integer*4result,mouseevents,keystate,mxpos,mypos,unit1
integer*2ix2,iy2
integer*2status2,lcx,lcy,rcx,rcy
*,ikod
real*8xmin,xmax,ymin,ymax,dxkoord,dykoord,nomertochki
common/melmmm/melmmm,iiix,iiiy,ix22,iy22
*,xxxmin,xxxmax,yyymin,yyymax
character(4)nomj
integer*2dummy
type(xycoord)pt
nomertochki=0
ix22=ix2
iy22=iy2
xxxmin=xmin
xxxmax=xmax
yyymin=ymin
yyymax=ymax
cЛеваякнопкаmouseнажата
result=registermouseevent(unit1,mouse$lbuttondown,subln)
cЛеваякнопкаmouseотпущена
result=registermouseevent(unit1,mouse$lbuttonup,sublo)
cПраваякнопкаmouseнажата
result=registermouseevent(unit1,mouse$rbuttondown,subrn)
cПраваякнопкаmouseотпущена
result=registermouseevent(unit1,mouse$rbuttonup,subro)
return
end
63
cПример.Леваякнопкаmouseнажата
subroutinesubln(unit1,mevent,keystate,mxpos,mypos)
usedib
integer*4melmmm,iiix,iiiy
common/melmmm/melmmm,iiix,iiiy,ix2,iy2
character(5)bufff1,bufff2

64 Глава 2. Обработка графической информации
common/buffer/bufff1,bufff2
character(4)nomj
integer*4result,mouseevents,keystate,mxpos,mypos,unit1,
integer*4mevent
integer*2status2,lcx,lcy,rcx,rcy
integer*2dummy
type(xycoord)pt
cПередаемсостояниекнопокмыши
result=mevent
result=keystate
cВыполняемзаданныедействия,связанныеснажатиемкнопки,
cнапример:
cВыборцветалинии
result=setcolorrgb(rgbtointeger(0,0,255))
cВыводимвфайл22координатыточкиэкранапринажатой
cкнопке
write(22,*)mxpos,mypos
r1=5
lcx=mxpos-r1
lcy=mypos-r1
rcx=mxpos+r1
rcy=mypos+r1
cРисуемэллипс
status2=ellipse($gborder,lcx,lcy,rcx,rcy)
rcx=mxpos-r1/2
rcy=mypos-r1/10
cВыводимтекстовоесообщение
callmoveto(rcx,rcy,pt)
calloutgtext('Запись')
3030format(i4)
melmmm=1
cЗапоминаемкоординатыточки
iiix=mxpos
iiiy=mypos

Пример 7. Выполнение функций подуправлением кнопок мыши
cЗаписьвфайл2
nomertochki=nomertochki+1
write(2,301)nomertochki,iiix,iiiy
301format(3i7,2f10.2)
cВозвраткурсоранапрежнееместо
lcx=mxpos
lcy=mypos
callmoveto(lcx,lcy,pt)
cЗаписькоординатвфайл2
write(2,30)mxpos
write(2,30)mypos
cЗапоминаемкоординатыточкивбуфередляпередачивдругие
cподпрограммы
write(bufff1,30)mxpos
write(bufff2,30)mypos
30format(i5)
return
end
65
cПример.Леваякнопкаmouseотпущена
subroutinesublo(unit1,mevent,keystate,mxpos,mypos)
usedib
integer*4melmmm
common/melmmm/melmmm
integer*4result,mouseevents,keystate,mxpos,mypos,unit1,
integer*4mevent
integer*2status2,lcx,lcy,rcx,rcy
type(xycoord)pt
cПередаемсостояниекнопокмыши
result=mevent
result=keystate
melmmm=0
return
end

66 Глава 2. Обработка графической информации
cПример.Праваякнопкаmouseнажата
subroutinesubrn(unit1,mevent,keystate,mxpos,mypos)
usedib
integer*4result,mouseevents,keystate,mxpos,mypos,unit1,
integer*4mevent
integer*2status2,lcx,lcy,rcx,rcy
type(xycoord)pt
record/wxycoord/s
character(4)nomj
character(8)nomj8
real*8x1,y1,xmin,xmax,ymin,ymax,dxkoord,dykoord,ddx,ddy
*,x2,y2
common/melmmm/melmmm,iiix,iiiy,ix2,iy2
*,xxxmin,xxxmax,yyymin,yyymax,nomertochki
cПередаемсостояниекнопокмыши
result=mevent
result=keystate
cВыполняемзаданныедействия,связанныеснажатиемкнопки,
cнапример
cВыборцветалинии
result=setcolorrgb(rgbtointeger(0,255,0))
cРисованиелинииизначальнойточкидовыделеннойточки
lcx=mxpos
lcy=mypos
status2=lineto(lcx,lcy)
cЗапоминаемкоординатыточки
iiix=mxpos
iiiy=mypos
3030format(i4)
cОпределяемдействительныекоординатыточки
dxkoord=(xxxmax-xxxmin)/ix2
x1=xxxmin+dxkoord*(iiix-1)

Пример 7. Выполнение функций подуправлением кнопок мыши
dykoord=(yyymax-yyymin)/iy2
y1=yyymax-dykoord*(iiiy-1)
cРисуемкрестнаграфикевместерасположениявыделенной
cточки
ddx=10*dxkoord
ddy=10*dykoord
callkrest(ij,x1,y1,ddx,ddy)
cВозвраткурсоранапрежнееместо
lcx=mxpos
lcy=mypos
callmoveto(lcx,lcy,pt)
return
end
cПример.Праваякнопкаmouseотпущена
subroutinesubro(unit1,mevent,keystate,mxpos,mypos)
usedib
integer*4melmmm
common/melmmm/melmmm,iiix,iiiy
integer*4result,mouseevents,keystate,mxpos,mypos,unit1,
integer*4mevent
integer*2status2,lcx,lcy,rcx,rcy
type(xycoord)pt
cПередаемсостояниекнопокмыши
result=mevent
result=keystate
melmmm=0
return
end
67
Виды подпрограмм subln, sublo, subrn, subro приведены лишь вка-
честве примеров. Они могут быть изменены, вних могут быть предусмотрены выполнения других процедур, в соответствии с решаемой зада-

68 Глава 2. Обработка графической информации
чей. Например, можно вызвать процедуру определения цвета выбранной точки экрана, может быть нарисован график, выведена заставка на
экран, могут быть вызваны вычислительные процедуры ит.п.
Пример 8. Организация режима диалога
Замечание. Использование диалогов стандартными средствами языка
рассмотрено в литературе, например в книге О.В. Бартеньева «Visual
Fortran: Новые возможности». Эти процедуры выполняются сподключением дополнительных модулей (DIALOGM.MOD или DFLOGM.MOD).
Если такой способ по каким-либо причинам не устраивает пользователя
(не хочет подключать дополнительные файлы ибиблиотеки, не нравится оформление окон идр.), то режим диалога может быть организован
программными средствами самостоятельно, с выполнением собственных настроек ипожеланий. Впримере приведен один из вариантов решения такой задачи.
cПодключаемграфическиепроцедуры
usedib
PARAMETER(MXBLOK=2048)
implicitreal*8(a-h,o-z)
cПараметрынастройкирисунка
common/nastroika/
*polelew,polepraw,polewerh,poleniz,razmergr,
*rismax,rismin,risrez,
*xsdwiga(100),ysdwiga(100),xsdwigagr,ysdwigagr,
*megrReIm,mezwgr,mezwizo,mezwskel,
*mefont,mecifr,mekarkas,
*mesilowozb,mekanal,megodograf,mezast,mesglag,
*megrFazaAm,nomerzweta(6)
character(3)namele
character(20)namein
character(33)fff
character(80)zagolowok,kt

Пример 8. Организация режима диалога
record/rccoord/curpos
integer*2dummy
integer*2iix2,iiy2
integer*2ix2,iy2
common/melmmm/melmmm,iiix,iiiy,ix2,iy2
*,xxmin,xxmax,yymin,yymax,nomertochki
common/klik/klik,klik1,klik2,klik3
integer*4i4,iche,okno,okno3,okno4
common/oknoris/okno,okno3,okno4
cОткрылиокно
type(qwinfo)qw
qw.type=qwin$max
i4=setwsizeqq(qwin$framewindow,qw)
callsettextwindow(1,1,40,20)
i4=focusqq(qwin$framewindow)
cОткрыливыходнойфайл
OPEN(UNIT=2,FILE='Dial.res')
69
cОткрылифайлывходныхданных
open(unit=13,le='13.txt',form='formatted',
*status='old',access='sequential',iostat=iche)
if(iche.ne.0)stop'Ненайденфайл13.txt'
open(unit=14,le='14.txt',form='formatted',
*status='old',access='sequential',iostat=iche)
if(iche.ne.0)stop'Ненайденфайл14.txt'
cСчитываемкомментариикфайлуданных(располагаются
cвпервых5строках)
do765i=1,5
read(13,'(a)')zagolowok
write(2,*)zagolowok
765continue
cРазмерэкранамонитора
read(13,*)ix2,iy2

70 Глава 2. Обработка графической информации
write(2,*)ix2,iy2
iix2=ix2
iiy2=iy2
cМногооконныйвывод.
cОткрылиокно3
okno3=3
qw.x=0
qw.y=0
qw.h=80
qw.w=160
OPEN(UNIT=3,FILE='user')
i4=setwsizeqq(okno3,qw)
callsetviewport(0,0,iix2,iiy2)
cОткрылиокно4
okno4=4
OPEN(UNIT=4,FILE='user')
i4=setwsizeqq(okno4,qw)
cГлавноеокно
i4=focusqq(0)
result=setwsizeqq(0,qw)
klik=0
klik1=0
klik2=0
klik3=0
xxmin=0
xxmax=1
yymin=0
yymax=1
okno=okno4
i4=focusqq(okno)
nwrem=1000
cПереборрисуемыхкадров(впримереограничилисьвеличиной
cnwrem=1000)
do70nt=1,nwrem
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
