Показать сообщение отдельно
Старый 11.01.2008, 22:55   #8
FrankH
Разработчик
 
Регистрация: 09.12.2007
Сообщений: 376
Написано 83 полезных сообщений
(для 122 пользователей)
Re: Примеры элементов GUI

Выпадающий свиток
Визуально такой элемент является удобным и информативным, однако есть ситуации, где необходимо сделать выбор из десятка и более предложений. Вы, наверное, представили себе заполненный кнопками экран... Конечно, такой метод не годится для большого списка вариантов ответов. Для этих целей было бы неплохо создать динамический элемент, показывающий весь список ответов только при необходимости. Напишем свиток, а для него введем еще переменную:
Global svit1=0 Она будет отвечать за состояние этого (и только) свитка. Если у вас два свитка в меню, добавьте еще одну переменную. Приступим к созданию выпадающего свитка:
Function TrackerShort5_1(atx,aty,sizx,sizy,name1$,name2$,na me3$,name4$,name5$,expl$,typ,clr,state) ;switcher x5
If state=1 name$=name1$ ;этот выпадающий список рассчитан на максимум пять вариантов
If state=2 name$=name2$ ;в случае, если вам необходимо больше, добавьте переменных
If state=3 name$=name3$ ;name6$, name7$ и т.д. везде, где присутствуют name1$ - name5$.
If state=4 name$=name4$ ;если же вы будете использовать меньше максимума - 4, просто при вызове
If state=5 name$=name5$ ;функции вместо названия для name5$ укажите ноль
;если typ=1 то рисуем кнопку, она будет рамкой для списка
If typ DrawImage MenuButtonMPASS, atx-5,aty-5

;проверяем переменные начиная с конца, если находим ноль - уменьшаем список
If name5$ Then d=5 Else If name4$ Then d=4 Else If name3$ Then d=3 Else If name2$ Then d=2 Else If name1$ Then d=1 Else d=0

;проверяем наведена ли мышь на основное поле свитка
If ((Mouse_HitX>atx) And (Mouse_HitX<atx+sizx) And (Mouse_HitY>aty) And (Mouse_HitY<aty+sizy) And clr) Then
If Mouse_Hit Then ;если да и ЛКМ - ставим ключ что свиток развернут
svit1=1
Mouse_Hit=0
Else ;если да но нет ЛКМ, рисуем нажатую кнопку и проверяем счетчик подсказки
If typ DrawImage MenuButtonMON, atx-5,aty-5
If expl$<>0 And help_delay=maxhelp_delay Then exploration$=expl$
EndIf
Else ;иначе если клик вне списка - сворачиваем его
If Mouse_Hit And ((Mouse_HitX<atx) Or (Mouse_HitX>atx+sizx) Or (Mouse_HitY<aty) Or (Mouse_HitY>aty+sizy*(d+1))) Then svit1=0
EndIf
Color 100-100*clr,100-100*clr,100-100*clr ;пишем в основном поле имя активного элемента списка
Text atx+sizx*.5,aty+sizy*.5,name$,1,1
If svit1 ;если свиток развернут, рисуем фон для списка
Color 0,0,0
Rect atx,aty+sizy,sizx,sizy*d,1
Color RIC1,GIC1,BIC1
Rect atx,aty,sizx,sizy*(d+1),0
;подсвечиваем элемент списка что сейчас под курсором мышки
For i=1 To d
If (Mouse_HitX>atx) And (Mouse_HitX<atx+sizx) And (Mouse_HitY>aty+sizy*i) And (Mouse_HitY<aty+sizy*(i+1)) Then
Color RIC3,GIC3,BIC3
Rect atx+1,aty+1+sizy*i,sizx-2,sizy-2,1
If Mouse_Hit Then state=(Mouse_HitY-aty)/sizy svit1=0 ;если ЛКМ, получаем номер выбранного элемента
EndIf
Next

;теперь выводим имена элементов в списке
Color RIC1,GIC1,BIC1
t=atx+sizx*.5
If d>0 Text t,aty+sizy*1+sizy*.5,name1$,1,1
If d>1 Text t,aty+sizy*2+sizy*.5,name2$,1,1
If d>2 Text t,aty+sizy*3+sizy*.5,name3$,1,1
If d>3 Text t,aty+sizy*4+sizy*.5,name4$,1,1
If d>4 Text t,aty+sizy*5+sizy*.5,name5$,1,1

EndIf
Return state
End Function
(Offline)
 
Ответить с цитированием