Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Обработка текстовой и графической информации

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 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. Округление значений параметров
subroutineschag8(dx) implicitreal*8(a-h,o-z) character(9)nle8 character(3)index character(1)simwol(9) equivalence(simwol(1),nle8),(simwol(7),index) cОкруглениешагаdx 30format(i3) 31format(g5.1) 32format(g9.1) 39format(9a1) write(nle8,32)dx read(nle8,39)simwol read(nle8,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)
subroutinesubmous *(unit1,melm,xmin,xmax,ymin,ymax,ix2,iy2) usedib externalsubln externalsublo externalsubrn externalsubro integer*4melmmm,melm
Пример 7. Выполнение функций подуправлением кнопок мыши
integer*4result,mouseevents,keystate,mxpos,mypos,unit1 integer*2ix2,iy2 integer*2status2,lcx,lcy,rcx,rcy *,ikod real*8xmin,xmax,ymin,ymax,dxkoord,dykoord,nomertochki common/melmmm/melmmm,iiix,iiiy,ix22,iy22 *,xxxmin,xxxmax,yyymin,yyymax character(4)nomj integer*2dummy 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нажата
subroutinesubln(unit1,mevent,keystate,mxpos,mypos) usedib integer*4melmmm,iiix,iiiy common/melmmm/melmmm,iiix,iiiy,ix2,iy2 character(5)bufff1,bufff2
64 Глава 2. Обработка графической информации
common/buffer/bufff1,bufff2 character(4)nomj integer*4result,mouseevents,keystate,mxpos,mypos,unit1, integer*4mevent integer*2status2,lcx,lcy,rcx,rcy integer*2dummy 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Выводимтекстовоесообщение callmoveto(rcx,rcy,pt) calloutgtext('Запись') 3030format(i4) melmmm=1 cЗапоминаемкоординатыточки iiix=mxpos iiiy=mypos
Пример 7. Выполнение функций подуправлением кнопок мыши
cЗаписьвфайл2 nomertochki=nomertochki+1 write(2,301)nomertochki,iiix,iiiy 301format(3i7,2f10.2) cВозвраткурсоранапрежнееместо lcx=mxpos lcy=mypos callmoveto(lcx,lcy,pt) cЗаписькоординатвфайл2 write(2,30)mxpos write(2,30)mypos cЗапоминаемкоординатыточкивбуфередляпередачивдругие cподпрограммы write(bufff1,30)mxpos write(bufff2,30)mypos 30format(i5) return end
65
cПример.Леваякнопкаmouseотпущена
subroutinesublo(unit1,mevent,keystate,mxpos,mypos) usedib integer*4melmmm common/melmmm/melmmm integer*4result,mouseevents,keystate,mxpos,mypos,unit1, integer*4mevent integer*2status2,lcx,lcy,rcx,rcy type(xycoord)pt cПередаемсостояниекнопокмыши result=mevent result=keystate melmmm=0 return end
66 Глава 2. Обработка графической информации
cПример.Праваякнопкаmouseнажата
subroutinesubrn(unit1,mevent,keystate,mxpos,mypos) usedib integer*4result,mouseevents,keystate,mxpos,mypos,unit1, integer*4mevent integer*2status2,lcx,lcy,rcx,rcy type(xycoord)pt record/wxycoord/s character(4)nomj character(8)nomj8 real*8x1,y1,xmin,xmax,ymin,ymax,dxkoord,dykoord,ddx,ddy *,x2,y2 common/melmmm/melmmm,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 3030format(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 callkrest(ij,x1,y1,ddx,ddy) cВозвраткурсоранапрежнееместо lcx=mxpos lcy=mypos callmoveto(lcx,lcy,pt) return end
cПример.Праваякнопкаmouseотпущена
subroutinesubro(unit1,mevent,keystate,mxpos,mypos) usedib integer*4melmmm common/melmmm/melmmm,iiix,iiiy integer*4result,mouseevents,keystate,mxpos,mypos,unit1, integer*4mevent integer*2status2,lcx,lcy,rcx,rcy type(xycoord)pt cПередаемсостояниекнопокмыши result=mevent result=keystate melmmm=0 return end
67
Виды подпрограмм subln, sublo, subrn, subro приведены лишь вка-
честве примеров. Они могут быть изменены, вних могут быть предусмо­трены выполнения других процедур, в соответствии с решаемой зада-
68 Глава 2. Обработка графической информации
чей. Например, можно вызвать процедуру определения цвета выбран­ной точки экрана, может быть нарисован график, выведена заставка на экран, могут быть вызваны вычислительные процедуры ит.п.
Пример 8. Организация режима диалога
Замечание. Использование диалогов стандартными средствами языка рассмотрено в литературе, например в книге О.В. Бартеньева «Visual Fortran: Новые возможности». Эти процедуры выполняются сподключе­нием дополнительных модулей (DIALOGM.MOD или DFLOGM.MOD). Если такой способ по каким-либо причинам не устраивает пользователя (не хочет подключать дополнительные файлы ибиблиотеки, не нравит­ся оформление окон идр.), то режим диалога может быть организован программными средствами самостоятельно, с выполнением собствен­ных настроек ипожеланий. Впримере приведен один из вариантов ре­шения такой задачи.
cПодключаемграфическиепроцедуры usedib PARAMETER(MXBLOK=2048) implicitreal*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)namele character(20)namein character(33)fff character(80)zagolowok,kt
Пример 8. Организация режима диалога
record/rccoord/curpos integer*2dummy integer*2iix2,iiy2 integer*2ix2,iy2 common/melmmm/melmmm,iiix,iiiy,ix2,iy2 *,xxmin,xxmax,yymin,yymax,nomertochki common/klik/klik,klik1,klik2,klik3 integer*4i4,iche,okno,okno3,okno4 common/oknoris/okno,okno3,okno4
cОткрылиокно type(qwinfo)qw qw.type=qwin$max i4=setwsizeqq(qwin$framewindow,qw) callsettextwindow(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строках) do765i=1,5 read(13,'(a)')zagolowok write(2,*)zagolowok 765continue 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) callsetviewport(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Переборрисуемыхкадров(впримереограничилисьвеличиной cnwrem=1000) do70nt=1,nwrem
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]