Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 8. Организация режима диалога
character(1)nomj1,chisl(12),chis(12)
character(12)chislo
equivalence(chislo,chisl(1))
integer*2dummy
integer*2kodsimwol
character(1)kod1
cКодыкнопокклавиатуры(0,1,2,3,4,5,6,7,8,9,-,.,+,d,e),
cкоторыемогутбытьиспользованыдлявводачисловыхданных
dimensionkodi(15)
datakodi/48,49,50,51,52,53,54,55,56,57,45,46,43,100,101
*/
common/klik/klik,klik1,klik2,klik3
character(5)resnt
integer*2ixswerhu(1000),iyswerhu(1000)
*,ixslewa(1000),iyslewa(1000)
*,ixsperedi(1000),iysperedi(1000)
*,nomer(1000)
integer*2zad1,zad2
*,NOS1,NOS2
*,kil1,kil3
*,niz1,niz3
*,krilolew2,krilopraw2
*,krilolew3,krilopraw3
cМассивыдляхраненияреальныхкоординатточек
common/razmeri/xt(1000),yt(1000),zt(1000)
*,dlinaLA,wisotaLA,razmahLA
91
cОпределениеразмеровиспользуемыхрисунков.
cПереборфайловсрисунками
do2222kn=1,3
write(2,*)
if(kn.eq.1)open(1,le=foto1,form='binary',iostat=iche)
if(kn.eq.2)open(1,le=foto2,form='binary',iostat=iche)
if(kn.eq.3)open(1,le=foto3,form='binary',iostat=iche)

92 Глава 2. Обработка графической информации
ci4=0—приуспешномвыполнении
if(iche.eq.0)write(2,*)'Найденфайлрисунка'
if(iche.ne.0)write(2,*)'Ненайденфайлрисунка'
if(kn.eq.1)write(2,*)'Рисунокfoto1'
if(kn.eq.2)write(2,*)'Рисунокfoto2'
if(kn.eq.3)write(2,*)'Рисунокfoto3'
if(iche.ne.0)goto2222
cОпределяемразмерырисунков
read(1)ch
read(1)ix
read(1)iy
write(2,*)
write(2,*)'Ширинарисункаix=',ix
write(2,*)'Высотарисункаiy=',iy
write(2,*)
if(ix.gt.ix2)write(2,*)'Рисунокширеразмераэкрана!'
if(iy.gt.iy2)write(2,*)'Рисуноквышеразмераэкрана!'
cЗапомнилиразмерырисунковвмассивах
irisx(kn)=ix
irisy(kn)=iy
close(1)
cЗакрылифайлсрисунком
2222continue
cКонецпереборафайловсрисунками
cОчисткалевойчастиэкрана(заливкабелымцветом)
c15—задаембелыйцвет
dummy=setcolor(15)
cРисуемпрямоугольник
dummy=rectangle($gllinterior,0,iy2,(ix2-200),0)
cНазначилиположениянаэкраневерхнихлевыхугловрисунков
c(вданномслучаерассматриваем3рисунка)
iux(1)=0
iuy(1)=0

Пример 8. Организация режима диалога
iux(2)=0
iuy(2)=300
iux(3)=650
iuy(3)=0
cЗадержка1000ms
callsleepqq(1000)
cОпределяемномернажатойнарисованнойнаэкранекнопки
c(knopkaris)
callsubmous(okno,melm,xx1,xx2,yy1,yy2,ix2,iy2)
cЗадержка1000ms
callsleepqq(1000)
cВзависимостиотномера(knopkaris)нарисованнойнаэкране
cкнопки,накоторуюмынавеликурсорmouseинажалилевую
cкнопкуmouse,выполняемзадаваемоенамидействие.
cВданномслучаевыводимнаэкраннужныйнамрисунок
if(knopkaris.eq.1)i4=loadimage(foto1,iux(1),iuy(1))
if(knopkaris.eq.2)i4=loadimage(foto2,iux(2),iuy(2))
if(knopkaris.eq.3)i4=loadimage(foto3,iux(3),iuy(3))
cЕслинажатанарисованнаянаэкранекнопкасномером4,
cтовызываетсяподпрограммасименемObrabotka
if(knopkaris.eq.4)callObrabotka
1001continue
write(7,3701)knopkaris,iiix,iiiy
3701format(3i5,'knopkaris,iiix,iiiy')
93
cДругиекнопкивданномпримеренезадействованы,
cприихнажатииидемнавыход
if(knopkaris.gt.4)goto2002
cОрганизуемвводданных.
c9—задаемяркосинийцвет
dummy=setcolor(9)
cЗадаемположениетекстанаэкране
lcx=700

94 Глава 2. Обработка графической информации
lcy=50
callmoveto(lcx,lcy,pt)
cВыводимнаэкрансообщениевзависимостиотномеранажатой
cкнопки
if(knopkaris.eq.1)calloutgtext('Видслева')
if(knopkaris.eq.1)write(2,*)'Видслева'
if(knopkaris.eq.2)calloutgtext('Видсверху')
if(knopkaris.eq.2)write(2,*)'Видсверху'
if(knopkaris.eq.3)calloutgtext('Видспереди')
if(knopkaris.eq.3)write(2,*)'Видспереди'
cДляконтролясообщениезапомнилиивфайле2
cЗадержка1000ms
callsleepqq(1000)
if(klik.ne.0)goto22000
klik=klik+1
irx=700
iry=700
lrx=400
lry=100
text='ДлинаЛА'
cВводданныхсклавиатуры
callWwodDannih(irx,iry,lrx,lry,text,DlinaLA)
iry=800
text='ВысотаЛА'
cВводданныхсклавиатуры
callWwodDannih(irx,iry,lrx,lry,text,WisotaLA)
iry=900
text='РазмахкрылаЛА'
cВводданныхсклавиатуры
callWwodDannih(irx,iry,lrx,lry,text,RazmahLA)
cОчисткачастиэкрана(рисуембелыйпрямоугольник).
c15—задаембелыйцвет
dummy=setcolor(15)

Пример 8. Организация режима диалога
cРисуемпрямоугольник
dummy=rectangle($gllinterior,400,1000,1200,700)
ntochek=0
itoch=0
22000continue
write(7,3001)
write(okno,3001)
3001format
*('Видслева.Положительноенаправлениеосей:X-влево,
*Y-вверх')
if(klik1.ne.0)goto102
klik1=klik1+1
cЗагрузканаэкранрисункасименемfoto1.Координатыугла
cрисункаiux(1),iuy(1)
i4=loadimage(foto1,iux(1),iuy(1))
cЗадержка1000ms
callsleepqq(1000)
c9-Задаемяркосинийцвет
dummy=setcolor(9)
cЗадаемположениевыводимоготекста
irx=100
iry=800
callmoveto(irx,iry,pt)
cВыводимтекстнаэкран
calloutgtext
*('Положительноенаправлениеосей:X-влево,Y-вверх')
ikod=1
cЗадаемположениевыводимоготекста
irx=100
iry=820
callmoveto(irx,iry,pt)
cВыводимтекстнаэкран
calloutgtext('Отметьтекнопкойmouseправуюдальнюю
*точку(хвостЛА)')
95

96 Глава 2. Обработка графической информации
read(okno,*)!Ждетнажатиякнопки"ENTER"
zad1x=iiix
zad1y=iiiy
write(7,3101)iiix,iiiy
3101format(2i5,'iiix,iiiy—Координатыхвоста(O)')
cОчистиличастьэкрана(рисуембелыйпрямоугольник)
dummy=setcolor(15)
dummy=rectangle($gllinterior,100,900,1000,800)
cНосЛА
c9-Задаемяркосинийцвет
dummy=setcolor(9)
cЗадаемположениевыводимоготекста
irx=100
iry=840
callmoveto(irx,iry,pt)
cВыводимтекстнаэкран
calloutgtext
*('Отметьтекнопкойmouseлевуюдальнююточку(носЛА)')
read(okno,*)!Ждетнажатиякнопки"ENTER"
cПоложениеносаЛА
nos1x=iiix
nos1y=iiiy
write(7,3102)iiix,iiiy
3102format(2i5,'iiix,iiiy—КоординатыносаЛА')
cОчистиличастьэкрана(рисуембелыйпрямоугольник)
dummy=setcolor(15)
dummy=rectangle($gllinterior,100,900,1000,800)
Конец фрагмента подпрограммы subroutine subbb1 (jjj)
Пример 9. Ввод цифровых данных
с клавиатуры
subroutineWwodDannih(irx,iry,lrx,lry,text,dlina)
usedib

Пример 9. Ввод цифровых данных склавиатуры
integer*2status2,lcx,lcy,rcx,rcy
integer*2lcx2,lcy2,rcx2,rcy2
integer*2irx,iry,lrx,lry
type(xycoord)pt
record/wxycoord/s
character(20)text
integer*2ix2,iy2
common/melmmm/melmmm,iiix,iiiy,ix2,iy2
*,xxxmin,xxxmax,yyymin,yyymax,nomertochki
cПеременныедлявводаданных
real*8dlina
dimensionkchis(12)
character(1)nomj1,chisl(12),chis(12)
character(12)chislo
equivalence(chislo,chisl(1))
integer*2dummy
integer*2kodsimwol
character(1)kod1
logical*4pressed
97
cКодыкнопокклавиатуры,которыемогутбытьиспользованы
cпривводецифровыхданных(0,1,2,3,4,5,6,7,8,9,-,.,+,d,e)
dimensionkodi(15)
datakodi/48,49,50,51,52,53,54,55,56,57,45,46,43,100,101/
1002continue
cЛевыйверхнийуголпрямоугольникаirx,iry,ширина=lrx,
cвысота=lry
lcx=irx
rcx=lcx+lrx
lcy=iry
rcy=lcy+lry
c2—задаемзеленыйцвет
dummy=setcolor(2)

98 Глава 2. Обработка графической информации
cРисуемпрямоугольник
dummy=rectangle($gllinterior,lcx,rcy,rcx,lcy)
lcx2=lcx+10
rcx2=rcx-10
lcy2=lcy+10
rcy2=rcy-10
c15—задаембелыйцвет
dummy=setcolor(15)
cВнутризеленогопрямоугольникарисуембелыйпрямоугольник
dummy=rectangle($gllinterior,lcx2,rcy2,rcx2,lcy2)
c12—задаемкрасныйцвет
dummy=setcolor(12)
cВыводимнадписи
callmoveto((lcx+50),(lcy+20),pt)
calloutgtext(text)
callmoveto((lcx+50),(lcy+40),pt)
calloutgtext('Введите')
cЗаполняемсимвольнуюпеременнуюпробелами
do1k=1,12
chisl(k)=''
c13—нажатакнопка"Enter"
kchis(k)=13
1continue
cВводданныхсклавиатуры
c(впримеревводимоечислоограничено12символами)
do2k=1,12
cОпределяемфактнажатиякнопкиклавиатуры.
cНашликодкнопки
kod1=getcharqq()
chis(k)=kod1
cОпределилиномеркнопкивсписке
i=ichar(kod1)
kchis(k)=i
cНажатакнопка"Enter"
if(i.eq.13)goto22

Пример 9. Ввод цифровых данных склавиатуры
cДляконтролязапомнилирезультатвфайле2
write(2,*)kod1,i
3050format(a4)
3051format(a1)
cЗаписываем(kod1)всимвольнуюпеременную(nomj1)
write(nomj1,3051)kod1
cРисуемсимволнажатойкнопкинаэкране
calloutgtext(nomj1)
cЗаносимсимволочереднойнажатойкнопкивпеременнуюchislo
chisl(k)=nomj1
2continue
22continue
cВыполняемпроверкуправильностиввода.Считываемчисловое
cзначение(dlina)изсимвольнойпеременной(chislo)
read(chislo,*,iostat=iche)dlina
if(iche.eq.0)goto700
99
cОбнаруженаошибкаввода
callmoveto((lcx+50),(lcy+60),pt)
calloutgtext('Ошибкаввода')
calloutgtext(chislo)
write(2,*)'Ошибкаввода'
cЗадержкаповремени1000ms
callsleepqq(1000)
goto1002
cОшибоквводанет
700continue
callmoveto((lcx+50),(lcy+60),pt)
calloutgtext('Введено')
calloutgtext(chislo)
write(2,*)'ЛАдлина=',dlina
1000continue

100 Глава 2. Обработка графической информации
return
end
cОпределяемфактнажатиякнопки"Enter"клавиатуры
subroutineEnter()
usedib
character(1)kod1
cНашликодкнопки
kod1=getcharqq()
cУзналиномеркнопкивсписке
i=ichar(kod1)
c13-нажатакнопка"Enter"
if(i.eq.13)goto1
cЗадержкавремени1000ms,есликнопка"Enter"ненажата
callsleepqq(1000)
1continue
return
end
Замечание. В примере показан лишь один из возможных вариантов
решения задачи. Могут быть предложены идругие варианты, например
на экране может быть нарисована клавиатура. Ввод данных может осуществляться нажатием кнопок мыши, которые по координатам курсора
определяют факт нажатия нужной нарисованной на экране кнопки клавиатуры (аналогично примеру 8). Можно рассмотреть более простые варианты, выделив зону ввода вдочернем окне (okno) ииспользуя операторы read(okno,*). Можно оставить видимой часть главного окна ивводить данные склавиатуры оператором read (*,*) ит.п.
Окно диалога может иметь вид, приведенный на рис. 2. Как видно из
рисунка, варианты оформления окон, количества, положений, размеров
иизображений кнопок управления, видов ишрифтов выводимых текстовых сообщений, видов рисунков могут быть самыми разными. Так
как рисунки заставок (кнопок) загружаются из отдельных файлов фор-
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
