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

Ввод
Итак, у нас есть основные элементы выбора готовых значений и цифр, однако нам еще кое-чего не хватает. Если вы вдруг захотите, чтобы игрок мог ввести свое имя перед игрой, указать IP адрес сервера или же назвать файл своего сохранения, вам понадобится функция, обеспечивающая ввод символов прямо с клавиатуры. Ниже приведен пример простенького, но все же рабочего элемента с полем ввода символов:
;функция ввода до max символов с начальным значением word$ Function CrtMenuInput$(atx,aty,name$,expl$,typ,clr,word$,ma x) ;Input Len=20
SetFont fnt2 ;устанавливаем шрифт

half_letter=5 ;реальная ширина одной буквы используемого шрифта в пикселях,
Input_size=max*half_letter ;для расчета ширины поля
newword$=word$
num=Len(word$)+1 ;узнаем количество символов в текущем слове (числовом значении)
savename=CreateBank(max+5) ;создаем банк памяти для динамической работы с
newsymbol=32 ;определенным количеством значений и временный символ
Color RIC3,GIC3,BIC3
ClsColor RIC3,GIC3,BIC3
Rect atx-Input_size,aty-10,Input_size*2,20,1 ;определяем область ввода и рисуем фон для текста
Color RIC1,GIC1,BIC1
TC=0 ;переменная для смена цвета текста во время ввода
For i=1 To num ;заносим текущее слово в банк для работы с ним
k$=Mid$(newword$,i,1)
PokeByte savename,i, Asc(k$)
Next
For i=num To max ;заполняем оставшуюся длину пробелами
PokeByte savename,i, 32
Next
Text atx,aty,newword$,1,1 ;вывод текущего слова на экран


If ((Mouse_HitX>atx-Input_size) And (Mouse_HitX<atx+Input_size) And (Mouse_HitY>aty-10) And (Mouse_HitY<aty+10) And clr) Then ;проверяем наведен ли курсор на рабочую область

TC=70 ;если да, изменяем цвет текста


If (Mouse_Hit) ;если ЛКМ, обнуляем буффер клавы и мыши,
Mouse_Hit=0 ;переводим вьюпорт на рабочую область
Flip 0
FlushKeys()
Viewport atx-Input_size, aty-10, Input_size*2, 20
While Not KeyHit(2 ;пока не нажали ввод
Cls

newsymbol=WaitKey() ;ждем ввода символа и
If (newsymbol= Then ;если нажат BACKSPACE то
If num>1 Then ;если символы еще есть
num=num-1 ;уменьшаем их количество
PokeByte savename,num,32 ;меняем символ в конце слова на пробел
EndIf
Else
If (newsymbol=27) Then ;если нажат ESCAPE то выходим из функции возвращая
newword$=word$ ;первоначальное слово
Text atx,aty,newword$,1,1
Viewport 0, 0, GWeit, GHeit ;возвращаем вьюпорт на весь экран
FreeBank savename
Return word$
EndIf
If (newsymbol>31) And (newsymbol<127) And (num<max+1) Then ;если нажат допустимый
PokeByte savename,num,newsymbol ;символ и есть куда писать, добавляем его к слову
num=num+1
EndIf
EndIf
newword$ = "" ;обнуляем временное слово
For j=1 To max ;и заполняем символами из банка интерпретируя коды
newword$ = newword$+Chr(PeekByte (savename,j))
Next

Text atx,aty,newword$,1,1 ;выводим результат

Flip 0

Wend
Viewport 0, 0, GWeit, GHeit ;возвращаем вьюпорт на весь экран
EndIf
If expl$<>0 And help_delay=maxhelp_delay Then exploration$=expl$ ;проверяем счетчик подсказки
EndIf

Color RIC1+TC,GIC1+TC,BIC1+TC*.5
Text atx,aty,newword$,1,1 ;выводим в рабочую область слово

newword$=Trim$(newword$) ;обрезаем пробелы в конце слова
FreeBank savename ;освобождаем банк
Return newword$ ;возвращаем результат
End Function
(Offline)
 
Ответить с цитированием