Добавлен , опубликован

Основы Интерфейса

Содержание:
EditBoxs (поля редактирования) - это однострочные текстовые фреймы, которые игроки могут редактировать (пример писать чат и пр).

fdf-функции EditBox

EditBorderSize
EditBorderSize real,
Пример:
EditBorderSize 0.009,
Изменяет размер границ текста. Это специально сделано, чтобы текст не вылезал за пределы.
границы в EditBorderSize невидимы. Но чем толще становится граница, тем текст становится более обрезанным (невидимым):
EditBorderSize 0.009, станд
EditBorderSize 0.015,
EditBorderSize 0.019,
При EditBorderSize 0.02 не видно текста совсем
EditCursorColor
EditCursorColor real real real,
еняет цвет курсора ввода.
Существуют два понятия – курсор ввода и указатель мыши. Курсор ввода представляет собой мигающую вертикальную полоску |. Он указывает место, в которое будет вводиться текст. Для его перемещения используются клавиши управления курсором или мышь. Для перемещения курсора с помощью мыши следует установить указатель мыши в нужную позицию и щелкнуть клавишей мыши.
При нажатии по полю курсор ввода подсвечивается
Примеры:
EditCursorColor 1.0 1.0 1.0, //станд белый
EditCursorColor 1.0 0.0 0.0,  //красный
EditTextFrame
EditTextFrame FrameName,
Короче указываем фрейм TEXT с настройками стиля текста: шрифт, цвет, размеры и прочее.
По некоторым причинам EditTextFrame не влияет на курсор. Сам EditBox может иметь FrameFont для изменения шрифта курсоров.
Пример:
EditTextFrame "SaveGameFileEditBoxText",
Если не указывать EditTextFrame, или никакого Text, то игра автоматически применяет свой TEXT. Это применяется к EditBox независимо, указан Text, не указан
EditTextFrame нужно указать фрейм типа TEXT. Пример указываем фрейм MyEditBoxTextTemplate:
EditTextFrame "MyEditBoxTextTemplate",
Frame "TEXT" "MyEditBoxTextTemplate" {
   DecorateFileNames,
    FrameFont "MasterFont", 0.015, "",
    FontColor 1.0 1.0 1.0,
    FontFlags "FIXEDSIZE",
}
В fdf-файлах по умолчанию есть 4 предопределенных поля редактирования мэйнфрейма, но 2 из них в основном "равны" какому-либо другому.
  • BattleNetEditBoxTemplate (same values as "StandardEditBoxTemplate")
  • StandardEditBoxTemplate
  • StandardDecoratedEditBoxTemplate (same values as "EscMenuEditBoxTemplate")
  • EscMenuEditBoxTemplate
По умолчанию все они не загружаются. В этом уроке я использую EscMenuEditBoxTemplate из UI \ FrameDef \ UI \ escmenutemplates.fdf.

FrameEvent EditBox

EditBox позволяет игроку вводить текст. Есть 2 события для полей редактирования, обрабатывающих ввод текста:
FRAMEEVENT_EDITBOX_TEXT_CHANGED - когда изменяется текст в EditBox
FRAMEEVENT_EDITBOX_ENTER - когда жму Enter
В обоих случаях используется BlzGetTriggerFrameText, чтобы получить text GetTriggerPlayer внутри своего поля во время синхронизации этого текста.
Длина BlzGetTriggerFrameText не превышает 255. Текст после позиции 255 не содержится внутри BlzGetTriggerFrameText.
Событие FRAMEEVENT_EDITBOX_ENTER срабатывает, когда у локального игрока ввод текста сфокусировано на EditBox, и он игрок жмет клавишу Enter /Return. Текущий локальный текст в поле редактирования будет BlzGetTriggerFrameText
Событие FRAMEEVENT_EDITBOX_TEXT_CHANGED срабатывает, когда у локального игрока текст EditBox изменился. Происходит это при редактировании текста игроком: добавлении / удалении текста игроком, или кодом (установка синхронизированного текста вызовет одно событие для каждого игрока). Это событие будет происходить довольно часто.
Вне этих событий для получения текста может потребоваться BlzFrameGetText, но BlzFrameGetText возвращает для каждого игрока текст, который в данный момент находится в его поле редактирования -> не синхронизируется в многопользовательской игре. Поэтому его нужно синхронизировать с помощью frameevents.

Пример EditBox с pdf

Пример fdf - кода. Короче, взят шаблон “EscMenuEditBoxTemplate” из escmenutemplates.fdf, я его немного упростил. И переименовал на MyEditBoxTemplate
fdf код для EDITBOX
Frame "EDITBOX" "MyEditBoxTemplate" {
Width 0.362,
Height 0.037,
EditBorderSize 0.009,
EditCursorColor 1.0 0.0 0.0,

ControlBackdrop "MyEditBoxBackdrop",
 Frame "BACKDROP" "MyEditBoxBackdrop" {
        DecorateFileNames,
        BackdropTileBackground,
        BackdropBackground  "EscMenuEditBoxBackground",
        BackdropCornerFlags "UL|UR|BL|BR|T|L|B|R",
        BackdropCornerSize  0.0125,
        BackdropBackgroundSize  0.256,
        BackdropBackgroundInsets 0.005 0.005 0.005 0.005,
        BackdropEdgeFile  "EscMenuEditBoxBorder",
        BackdropBlendAll,
}
    
EditTextFrame "MyEditBoxTextTemplate",
Frame "TEXT" "MyEditBoxTextTemplate" {
      DecorateFileNames,
      FrameFont "MasterFont", 0.015, "",
      FontColor 1.0 1.0 1.0,
     FontFlags "FIXEDSIZE",
       }
    
}
пример кода на jass:
код
//создаем frame
local framehandle f = BlzCreateFrame("MyEditBoxTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 0, 0)
//перемещаем frame
call BlzFrameSetAbsPoint(f, FRAMEPOINT_CENTER, 0.4, 0.3)
//задаем размеры frame
call BlzFrameSetSize(f, 0.2, 0.04)

пример EditBox с pdf на lua

кратко: это еще один пример. Делал не я. Он похожий, ничем не отличается верхнего пример. У него на lua, у меня на jass.
Это наш Lua-код для демонстрации. Он загружает пользовательский файл tocFile, создает фрейм с именем «EscMenuEditBoxTemplate» и регистрирует 2 события в этом фрейме. Кроме того, когда локальный проигрыватель сфокусирован на поле редактирования и нажимает Enter / return, его текущий текст вставки будет показан во фрейме сообщения, и это сообщение сохраняется в переменной gui udg_UserInput [playerIndex].
код
function EditBoxEnter()
    print("EditBoxEnter:")
    print(BlzGetTriggerFrameText())
    print(GetPlayerName(GetTriggerPlayer()))
   udg_UserInput[GetConvertedPlayerId(GetTriggerPlayer())] = BlzGetTriggerFrameText() --save the text of the local player in a synced manner.
 end
 
 function TEXT_CHANGED()
    --print("TEXT_CHANGED")
    --print(BlzGetTriggerFrameText())
    --print(GetPlayerName(GetTriggerPlayer()))
 end
 
 
do
    local real = MarkGameStarted
 function MarkGameStarted()
    real()
    BlzLoadTOCFile("war3mapimported\\templates.toc")
    local editbox = BlzCreateFrame("EscMenuEditBoxTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0,0) --create the box
    local eventHandler
    BlzFrameSetAbsPoint(editbox, FRAMEPOINT_CENTER, 0.4, 0.3) -- pos the box
    BlzFrameSetSize(editbox, 0.2, 0.03) --set the boxs size
    eventHandler = CreateTrigger() --Create the FRAMEEVENT_EDITBOX_ENTER trigger
    TriggerAddAction(eventHandler, EditBoxEnter)
    BlzTriggerRegisterFrameEvent(eventHandler, editbox, FRAMEEVENT_EDITBOX_ENTER)
    eventHandler = CreateTrigger() --Create the FRAMEEVENT_EDITBOX_TEXT_CHANGED trigger
    TriggerAddAction(eventHandler, TEXT_CHANGED)
    BlzTriggerRegisterFrameEvent(eventHandler, editbox, FRAMEEVENT_EDITBOX_TEXT_CHANGED)
 end
end
Этот триггер будет печатать текст, который локальный игрок в настоящее время показывает в своем поле редактирования. Отображаемый в данный момент текст, вероятно, не синхронизирован и может рассинхронизировать игру, если он используется синхронизированным образом.
print(BlzFrameGetText(BlzGetFrameByName("EscMenuEditBoxTemplate",0)))

Focus клавиатуры

Если у вас несколько EditBox, то тут еще нужно переключать фокус клавиатуры на нужный EditBox, пример:
BlzFrameSetFocus(EditBox, true)
Или вы можете таким же способом попробовать сбросить ввод текст, то есть фокус клавиатуры с EditBox. Пример, при нажатии на Enter, у вас сбрасывается фокус.

Text Limits

Кто-то может захотеть ограничить количество текста, которое игрок может поместить в EditBox, можно довольно просто установить такое ограничение с помощью кода.
Существует нативка:
BlzFrameSetTextSizeLimit takes framehandle frame, integer size
После использования BlzFrameSetTextSizeLimit (EditBox, 10) поле редактирования может содержать только 10 символов.
Как было сказано выше, не имеет большого смысла разрешать ограничение выше 255, когда текст должен использоваться внутри событий синхронно. EditBox может содержать 4096 символов, если это количество превышено, оно становится невидимым. (KeepVary) Вкл. по умолчанию поле редактирования использует TextSizeLimit равное -256, что позволяет вводить любой объем, но независимо от разрешенного ввода только 255 можно использовать внутри событий.
Текущий предел можно прочитать с помощью BlzFrameGetTextSizeLimit (EditBox).

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
37
2 года назад
0
Вот это поле, на самом деле, важнее, чем кажется. Как оно себя ведёт с разными комбинациями из ОС типа Ctrl+C/V/A/X, переключение режимов на Insert, что по поводу эмодзи?
1
27
2 года назад
Отредактирован MpW
1
ScorpioT1000, вы рофлите? какие эмодзи?
да никак он не ведет себя. нажатие одновременное Ctrl+буква или цифра = > ничего не происходит. работает только с буквами и цифрами.
Но если выделять текст мышкой, и нажать Ctrl+C => копирует текст в буфер
Ctrl+V => вставляет текст из буфера
Ctrl+A => никак не выделить текст
Insert => не знаю, что это за кнопка. Примерно понимаю, что на курсор ввода как-то влияет. Но по ощущениям ничего не происходит.
Может вылететь, у меня так и произошло.

я очень долго редактировал поле, и у меня вылетало.
помню писали об этом здесь, правда, там про десинки в мультиплеере. не знаю, мб это еще из-за дебага BlzFrameGetText (Editbox) или события FRAMEEVENT_EDITBOX_TEXT_CHANGED
Чтобы оставить комментарий, пожалуйста, войдите на сайт.