Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 8. Организация режима диалога
cВэтомокнесоздаемрисунок(активноеокно)
i4=setactiveqq(okno)
cВызываемподпрограммусозданиярисунка
callkoor
*(ix2,iy2,0,mezw,xxmin,xxmax,yymin,yymax,okno)
cВэтомокнепоказываемготовыйрисунок
i4=focusqq(okno)
cСменаокон(одноокносготовымкадромпоказываемнаэкране,
cвдругомокнесоздаемследующийкадр)
okno=okno4
okno4=okno3
okno3=okno
cЗадержкарисунканаэкране.Ждетнажатиякнопки«Enter»
read(okno,*)
70continue
stop
end
cПример.Подпрограммасозданиярисунка(фрагмент)
71
subroutinekoor
*(ix2,iy2,melm,mezw,xmin,xmax,ymin,ymax,okno)
usedib
logical*2true/.true./
integer*2i,j,dummy,maxx,maxy,BOUNDARY
integer*2ix2,iy2
integer*4i4,oknok,okno3,okno4,okno7,iche,oknoxyz
common/oknoris/oknok,okno3,okno4,okno7,oknoxyz
integer*4okno
cХранимвпеременной(knopkaris)номернажатойкнопкименю
common/knopkaris/knopkaris
real*8
*x1,x2,x3,x4,xc,y1,y2,y3,y4,yc,dx,ay
*,xmax,xmin,ymax,ymin,razmer
*,xxx,yyy,wx1,wy1,wx2,wy2,ddx,ddy

72 Глава 2. Обработка графической информации
*,dxkoord,dykoord
*,xx1,xx2,yy1,yy2,raz,p,pmax,rtau
*,x1p,x1st,y1p,y1st,x3p,x3st,y3p,y3st
*,axn,ayn,x1max,x1min,y1max,y1min
*,polelew,polepraw,polewerh,poleniz,razmergr
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)
record/wxycoord/s
type(xycoord)pt
commonmaxx,maxy
character(4)nomj
character(3)nomkanala
character(5)resnt
character(8)nle,nomj8
character(7)nle7
character(6)nle6
character(5)nle5
character(80)zagolowok
integer*4dummy4
integer*2status2,lcx,lcy,rcx,rcy
integer*2nomer(1000)
cУсловныекоординатыточекнаэкране
integer*2ixswerhu(1000),iyswerhu(1000)
*,ixslewa(1000),iyslewa(1000)
*,ixsperedi(1000),iysperedi(1000)
integer*2zad1,zad2
*,NOS1,NOS2
*,kil1,kil3
*,niz1,niz3

Пример 8. Организация режима диалога
*,krilolew2,krilopraw2
*,krilolew3,krilopraw3
cРеальныекоординатыточек
real*8xt(1000),yt(1000),zt(1000)
*,dlinaLA,wisotaLA,razmahLA
cПоложения(координаты)кнопокменюнаэкране
common/knopki/knopx(100),knopy(100),nknopok
character(32)zastawka,foto1,foto2,foto3
common/zast/zastawka(100),foto1,foto2,foto3
cЗдесьвыделилипамятьна100кнопок
cПример.Рассматриваем12кнопок.
cЗадалиименафайловдля12рисуемыхкнопок.
cФайлы*.bmp(содержатрисункисизображениямикнопок
cменю)расположенывсвоейдиректориипрограммы
datazastawka(1)/"demo_1.bmp"/
datazastawka(2)/"demo_2.bmp"/
datazastawka(3)/"demo_3.bmp"/
datazastawka(4)/"demo_4.bmp"/
datazastawka(5)/"demo_5.bmp"/
datazastawka(6)/"demo_6.bmp"/
datazastawka(7)/"demo_7.bmp"/
datazastawka(8)/"demo_8.bmp"/
datazastawka(9)/"demo_9.bmp"/
datazastawka(10)/"demo_10.bmp"/
datazastawka(11)/"demo_11.bmp"/
datazastawka(12)/"demo_12.bmp"/
73
cЗадалиименафайловобрабатываемыхвпрограммерисунков
datafoto1/"foto1.bmp"/
datafoto2/"foto2.bmp"/
datafoto3/"foto3.bmp"/
character*(17)lm1,lm2,lm3
datalm1/"Risunki\lm1.bmp"/

74 Глава 2. Обработка графической информации
datalm2/"Risunki\lm2.bmp"/
datalm3/"Risunki\lm3.bmp"/
integer*2ix22,iy22
common/melmmm/melmmm,iiix,iiiy,ix22,iy22
*,xxxmin,xxxmax,yyymin,yyymax
cПодключилишрифтыдлявыводатекстовыхсообщений
if(initializefonts().lt.0)continue
dummy=setfont("t'courier'"//'h24')
34format(f8.2)
3330format(i5)
cОпределилиразмеры
xxx=xmax-xmin
yyy=ymax-ymin
razmer=dsqrt(xxx*xxx+yyy*yyy)
cСоздалиокно
x1=xmin-polelew*xxx
x2=xmax+polepraw*xxx
y1=ymin-poleniz*yyy
y2=ymax+polewerh*yyy
xx1=x1
xx2=x2
yy1=y1
yy2=y2
dummy=setwindow(true,x1,y2,x2,y1)
cВыбралистильрисованиялиний
callsetlinestyle(#ffff)
ddx=0.010d0*xxx
ddy=0.010d0*yyy
cОчисткаокна(заполняембелымцветом)
dummy=setcolor(15)

Пример 8. Организация режима диалога
cНарисовалибелыйпрямоугольник
dummy=rectangle($gllinterior,0,iy2,ix2,0)
cЗадаемколичествокнопокменю
nknopok=12
cПеребираемрисуемыекнопки
do100jjj=1,nknopok
cЗадаемположениеверхнеголевогоугларисуемойнаэкране
cкнопки(впримерекнопкирасположеныповертикаливправой
cчастиэкрана)
knopx(jjj)=ix2-80
knopy(jjj)=81*jjj+1
cРисуемкнопкинаэкране
i4=loadimage(zastawka(jjj),knopx(jjj),knopy(jjj))
100continue
cПереключаемсянакнопкимыши
knopkaris=0
callsubmous(okno,melm,xx1,xx2,yy1,yy2,ix2,iy2)
c(Пример)Еслинажатанарисованнаякнопка1,2или3,
cтовызываетсяподпрограммаsubbb1
if(knopkaris.le.3)callsubbb1(knopkaris)
9999continue
return
end
75
Замечание. Количество, размеры, положения, вид иназначение кно-
пок могут считываться из внешнего файла данных. Имена файлов сизображениями кнопок не обязательно назначать с помощью оператора
data. С тем же успехом они могут быть считаны из файла данных или
введены сэкрана спомощью оператора read. Это позволяет пользователю управлять видом окон диалога без внесения изменений всаму программу. При желании можно управлять видом окна спомощью клавиатуры имыши, создавая все новые кнопки иновые окна. Вопросы вызывает лишь целесообразность подобного рода действий, так как

76 Глава 2. Обработка графической информации
пользователь привыкает копределенному виду окон программы. Хаотические изменения положений окон икнопок снижают производительность его труда, отвлекают внимание иведут кошибкам. При большом
количестве кнопок (ифункций программы) они занимают много места
на экране. Более удобным может оказаться вариант, когда кнопки сгруппированы функционально, расположены послойно снебольшим сдвигом иобеспечены переключения между слоями.
cПример.Нажаталеваякнопкаmouse(фрагментподпрограммы)
subroutinesubln(unit1,mevent,keystate,mxpos,mypos)
usedib
integer*4melmmm
cix2,iy2—количествоточек(пиксель)экранапогоризонтали
cивертикали
integer*2ix2,iy2
common/melmmm/melmmm,iiix,iiiy,ix2,iy2
cИменафайловзаставок,выводимыхвслучаенеобходимости
cнаэкран
character(32)zastawka,foto1,foto2,foto3
common/zast/zastawka(100),foto1,foto2,foto3
cПеременные,используемыедляуправленияцветамиточек
cэкрана
integer*2dummy2
integer*4RGB,Red1,Green1,Blue1,Red2,Green2,Blue2,dummy4
cВэтомпримерекнопкинарисованыспомощьюуже
cсуществующихфотографий(заставок"demo_*.bmp").Размеры
cзаставокприняты80*80=6400точек
integer*4xpix(6400),ypix(6400)
integer*4colorpix1(6400),colorpix2(6400)
cПоложениякнопокнаэкранеичислоэтихкнопок
common/knopki/knopx(100),knopy(100),nknopok

Пример 8. Организация режима диалога
cХранимномернажатойкнопки(knopkaris)
common/knopkaris/knopkaris
integer*4okno,okno3,okno4,iche
common/oknoris/okno,okno3,okno4
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Запомниликоординатыточки
iiix=mxpos
iiiy=mypos
77
cПримерывыводаграфическойинформациинаэкран.
cРисуемсинийкругсцентромвотмеченнойточкесрадиусом
cr1=5
dummy=setcolor(9)
r1=5
lcx=mxpos-r1
lcy=mypos-r1
rcx=mxpos+r1
rcy=mypos+r1
status2=ellipse($gborder,lcx,lcy,rcx,rcy)
3030format(i4)
cВыводимрисункикнопокнаэкран(заставки)
do101jjj=1,nknopok
i4=loadimage(zastawka(jjj),knopx(jjj),knopy(jjj))
101continue

78 Глава 2. Обработка графической информации
cПримеробработкизаставок.
cОпределяемцветаточекзаставки(вданномпримере
c80*80=6400pixel)
npix=6400
cКнопка1(нарисованнаянаэкране).
cКоординатынаэкраневерхнеголевогоуглакнопки1
j01=knopx(1)
i01=knopy(1)
cКнопка2(нарисованнаянаэкране).
cКоординатынаэкраневерхнеголевогоуглакнопки2
j02=knopx(2)
i02=knopy(2)
j1=1
j2=80
i1=1
i2=80
kkkpix=0
cПереборточекзаставки(пример)
do801j=j1,j2
do801i=i1,i2
kkkpix=kkkpix+1
cЗаставка1.
cНашлиномерцветаточкизаставки1(RGB)
RGB=getpixelRGB(j+j01,i+i01)
cЗапомнилицветвмассивеcolorpix1(6400)
colorpix1(kkkpix)=RGB
cЗаставка2.
cНашлиномерцветаточкизаставки1(RGB)
RGB=getpixelRGB(j+j02,i+i02)
cЗапомнилицветвмассивеcolorpix2(6400)
colorpix2(kkkpix)=RGB
801continue
cПереборточекзаставки(впримере80*80точек)
kkkpix=0

Пример 8. Организация режима диалога
cПереборточекпогоризонтали
do802j=j1,j2
cПереборточекповертикали
do802i=i1,i2
kkkpix=kkkpix+1
cНаходимкомпонентыцветовточек.
cRed-значениеинтенсивностикраснойкомпонентыцветаточки,
cGreen-значениеинтенсивностизеленойкомпонентыцвета
cточки,
cBlue-значениеинтенсивностисинейкомпонентыцветаточки.
cЗаставка1
RGB=colorpix1(kkkpix)
cНашликомпонентыцветаточки
callintegertoRGB(RGB,Red1,Green1,Blue1)
cЗаставка2
RGB=colorpix2(kkkpix)
cНашликомпонентыцветаточки
callintegertoRGB(RGB,Red2,Green2,Blue2)
79
Впрограмме могут быть предусмотрены изменения видов заставок.
Некоторые варианты обработки заставок приведены вследующих примерах.
cСуммируемрисункиЗаставка1иЗаставка2.
cИзмениликомпонентыцветовточекзаставок1и2исложили
cцвета(использовалисвоивесовыекоэффициентыдля
cотдельныхкомпонентцвета)
Red1=Red1*0.5+Red2*0.5
Green1=Green1*0.2+Green2*0.333
Blue1=Blue1*0.333+Blue2*0.2
cПроверяемвыполнениеограничений
if(Red1.lt.0)Red1=0
if(Red1.gt.255)Red1=255

80 Глава 2. Обработка графической информации
if(Green1.lt.0)Green1=0
if(Green1.gt.255)Green1=255
if(Blue1.lt.0)Blue1=0
if(Blue1.gt.255)Blue1=255
cНовый,измененныйцветточки(iii)
iii=setcolorrgb(rgbtointeger(Red1,Green1,Blue1))
cСдвинулиположениерисунканаэкране(j+300,i+40—новые
cкоординатыточки).
cНарисовалинаэкранеэтуточкусновымцветом
dummy4=setpixelrgb(j+300,i+40,iii)
cНарисовалибледныйувеличенныйрисунок(рисуемчерез1
cточкуэкрана)
dummy4=setpixelrgb(j+j+50,i+i+40,iii)
cНарисовалинаклонныйрисунок
c(сдвигамкаждуюследующуюстрокурисункапогоризонтали)
dummy4=setpixelrgb(j+i+400,i+60,iii)
cНарисовалисжатыйвдвоепогоризонталирисунок
jjjk=j/2
dummy4=setpixelrgb(jjjk+500,i+70,iii)
cНарисовалиискривленныерисунки
jjjk=j+50*sin(0.05*i)
dummy4=setpixelrgb(jjjk+70,i+100,iii)
iiik=i+50*sin(0.015*j)
dummy4=setpixelrgb(j+250,iiik+40,iii)
dummy4=setpixelrgb(jjjk+400,iiik+140,iii)
cНарисовализаставкувцикле(3раза)
do805kdf=1,3
cПовернулирисунок,уменьшилиисдвинулиповертикалиипо
cгоризонтали
d=0.5*kdf
r=sqrt(j**2+i**2+0.0000001)
=asin(j/r)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
