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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 8. Организация режима диалога
cВэтомокнесоздаемрисунок(активноеокно) i4=setactiveqq(okno) cВызываемподпрограммусозданиярисунка callkoor *(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,*) 70continue stop end
cПример.Подпрограммасозданиярисунка(фрагмент)
71
subroutinekoor *(ix2,iy2,melm,mezw,xmin,xmax,ymin,ymax,okno) usedib logical*2true/.true./ integer*2i,j,dummy,maxx,maxy,BOUNDARY integer*2ix2,iy2 integer*4i4,oknok,okno3,okno4,okno7,iche,oknoxyz common/oknoris/oknok,okno3,okno4,okno7,oknoxyz integer*4okno 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 commonmaxx,maxy character(4)nomj character(3)nomkanala character(5)resnt character(8)nle,nomj8 character(7)nle7 character(6)nle6 character(5)nle5 character(80)zagolowok integer*4dummy4 integer*2status2,lcx,lcy,rcx,rcy integer*2nomer(1000) cУсловныекоординатыточекнаэкране integer*2ixswerhu(1000),iyswerhu(1000) *,ixslewa(1000),iyslewa(1000) *,ixsperedi(1000),iysperedi(1000) integer*2zad1,zad2 *,NOS1,NOS2 *,kil1,kil3 *,niz1,niz3
Пример 8. Организация режима диалога
*,krilolew2,krilopraw2 *,krilolew3,krilopraw3 cРеальныекоординатыточек real*8xt(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меню)расположенывсвоейдиректориипрограммы datazastawka(1)/"demo_1.bmp"/ datazastawka(2)/"demo_2.bmp"/ datazastawka(3)/"demo_3.bmp"/ datazastawka(4)/"demo_4.bmp"/ datazastawka(5)/"demo_5.bmp"/ datazastawka(6)/"demo_6.bmp"/ datazastawka(7)/"demo_7.bmp"/ datazastawka(8)/"demo_8.bmp"/ datazastawka(9)/"demo_9.bmp"/ datazastawka(10)/"demo_10.bmp"/ datazastawka(11)/"demo_11.bmp"/ datazastawka(12)/"demo_12.bmp"/
73
cЗадалиименафайловобрабатываемыхвпрограммерисунков datafoto1/"foto1.bmp"/ datafoto2/"foto2.bmp"/ datafoto3/"foto3.bmp"/ character*(17)lm1,lm2,lm3 datalm1/"Risunki\lm1.bmp"/
74 Глава 2. Обработка графической информации
datalm2/"Risunki\lm2.bmp"/ datalm3/"Risunki\lm3.bmp"/
integer*2ix22,iy22 common/melmmm/melmmm,iiix,iiiy,ix22,iy22 *,xxxmin,xxxmax,yyymin,yyymax
cПодключилишрифтыдлявыводатекстовыхсообщений if(initializefonts().lt.0)continue dummy=setfont("t'courier'"//'h24') 34format(f8.2) 3330format(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Выбралистильрисованиялиний callsetlinestyle(#ffff)
ddx=0.010d0*xxx ddy=0.010d0*yyy cОчисткаокна(заполняембелымцветом) dummy=setcolor(15)
Пример 8. Организация режима диалога
cНарисовалибелыйпрямоугольник dummy=rectangle($gllinterior,0,iy2,ix2,0)
cЗадаемколичествокнопокменю nknopok=12 cПеребираемрисуемыекнопки do100jjj=1,nknopok cЗадаемположениеверхнеголевогоугларисуемойнаэкране cкнопки(впримерекнопкирасположеныповертикаливправой cчастиэкрана) knopx(jjj)=ix2-80 knopy(jjj)=81*jjj+1 cРисуемкнопкинаэкране i4=loadimage(zastawka(jjj),knopx(jjj),knopy(jjj)) 100continue cПереключаемсянакнопкимыши knopkaris=0 callsubmous(okno,melm,xx1,xx2,yy1,yy2,ix2,iy2) c(Пример)Еслинажатанарисованнаякнопка1,2или3, cтовызываетсяподпрограммаsubbb1 if(knopkaris.le.3)callsubbb1(knopkaris) 9999continue return end
75
Замечание. Количество, размеры, положения, вид иназначение кно-
пок могут считываться из внешнего файла данных. Имена файлов сизо­бражениями кнопок не обязательно назначать с помощью оператора data. С тем же успехом они могут быть считаны из файла данных или введены сэкрана спомощью оператора read. Это позволяет пользовате­лю управлять видом окон диалога без внесения изменений всаму про­грамму. При желании можно управлять видом окна спомощью клавиа­туры имыши, создавая все новые кнопки иновые окна. Вопросы вызы­вает лишь целесообразность подобного рода действий, так как
76 Глава 2. Обработка графической информации
пользователь привыкает копределенному виду окон программы. Хаоти­ческие изменения положений окон икнопок снижают производитель­ность его труда, отвлекают внимание иведут кошибкам. При большом количестве кнопок (ифункций программы) они занимают много места на экране. Более удобным может оказаться вариант, когда кнопки сгруп­пированы функционально, расположены послойно снебольшим сдви­гом иобеспечены переключения между слоями.
cПример.Нажаталеваякнопкаmouse(фрагментподпрограммы)
subroutinesubln(unit1,mevent,keystate,mxpos,mypos) usedib integer*4melmmm cix2,iy2—количествоточек(пиксель)экранапогоризонтали cивертикали integer*2ix2,iy2 common/melmmm/melmmm,iiix,iiiy,ix2,iy2 cИменафайловзаставок,выводимыхвслучаенеобходимости cнаэкран character(32)zastawka,foto1,foto2,foto3 common/zast/zastawka(100),foto1,foto2,foto3 cПеременные,используемыедляуправленияцветамиточек cэкрана integer*2dummy2 integer*4RGB,Red1,Green1,Blue1,Red2,Green2,Blue2,dummy4
cВэтомпримерекнопкинарисованыспомощьюуже cсуществующихфотографий(заставок"demo_*.bmp").Размеры cзаставокприняты80*80=6400точек integer*4xpix(6400),ypix(6400) integer*4colorpix1(6400),colorpix2(6400) cПоложениякнопокнаэкранеичислоэтихкнопок common/knopki/knopx(100),knopy(100),nknopok
Пример 8. Организация режима диалога
cХранимномернажатойкнопки(knopkaris) common/knopkaris/knopkaris integer*4okno,okno3,okno4,iche common/oknoris/okno,okno3,okno4 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Запомниликоординатыточки iiix=mxpos iiiy=mypos
77
cПримерывыводаграфическойинформациинаэкран. cРисуемсинийкругсцентромвотмеченнойточкесрадиусом cr1=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) 3030format(i4)
cВыводимрисункикнопокнаэкран(заставки) do101jjj=1,nknopok i4=loadimage(zastawka(jjj),knopx(jjj),knopy(jjj)) 101continue
78 Глава 2. Обработка графической информации
cПримеробработкизаставок. cОпределяемцветаточекзаставки(вданномпримере c80*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Переборточекзаставки(пример) do801j=j1,j2 do801i=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 801continue
cПереборточекзаставки(впримере80*80точек) kkkpix=0
Пример 8. Организация режима диалога
cПереборточекпогоризонтали do802j=j1,j2 cПереборточекповертикали do802i=i1,i2 kkkpix=kkkpix+1
cНаходимкомпонентыцветовточек. cRed-значениеинтенсивностикраснойкомпонентыцветаточки, cGreen-значениеинтенсивностизеленойкомпонентыцвета cточки, cBlue-значениеинтенсивностисинейкомпонентыцветаточки.
cЗаставка1 RGB=colorpix1(kkkpix) cНашликомпонентыцветаточки callintegertoRGB(RGB,Red1,Green1,Blue1) cЗаставка2 RGB=colorpix2(kkkpix) cНашликомпонентыцветаточки callintegertoRGB(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раза) do805kdf=1,3 cПовернулирисунок,уменьшилиисдвинулиповертикалиипо cгоризонтали d=0.5*kdf r=sqrt(j**2+i**2+0.0000001) =asin(j/r)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]