TextArea - это фрейм с отображением текста в определенной области (Area). Если текст не вмещается целиком, то он находится за пределами видимости, и для отображения можно прокрутить текст Scrollbar.
Scrollbar находится справа от TextArea? и блокирует часть пространства, предоставленного TextArea. Если TextArea достаточно большой для отображения всего текста, и текст влезает в это поле, то Scrollbar не отображается. Даже когда Scrollbar не отображается, она занимает свое место. Для не прокручиваемого текста можно просто использовать TEXT-Frame.
Built in TextArea (Встроенный TextArea)
Warcraft 3 имеет 2 встроенных мэйнфрейма TEXTAREA.
BattleNetTextAreaTemplate и EscMenuTextAreaTemplate
Они являются хорошей базой для наследования, копирования или их можно просто создать. Если кто-то хочет создать один из них, его нужно сначала загрузить с помощью BlzLoadTOCFile.
The fdfs containing them are located at:
UI\framedef\glue\battlenettemplates.fdf
UI\framedef\ui\escmenutemplates.fdf
UI\framedef\glue\battlenettemplates.fdf
UI\framedef\ui\escmenutemplates.fdf
fdf-функции для TextArea
TextAreaLineHeight
TextAreaLineGap
TextAreaInset
TextAreaMaxLines
TextAreaMaxLines integer,
Пример:
TextAreaMaxLines 20,
TextAreaMaxLines 20,
Сколько строк максимум может вместиться в TextArea. Отображается только такое количество строк, если добавляются новые строки, самые старые удаляются
Создание TextArea
Этот код jass создает TextArea, так и задает позицию, размер и заполняет их текстом. Очень важно, чтобы размер TextArea был достаточно большим, чтобы отображалась Scrollbar, в противном случае игра вылетает при попытке отобразить TextArea. Высота TextArea должна быть не менее 0,03. Это довольно мало, но если вы забудете установить размер, не указав размер по умолчанию, он будет равен 0, и игра вылетит.
код
function CreateDefaultTextAreas takes nothing returns nothing
local framehandle textArea = BlzCreateFrame("BattleNetTextAreaTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0,0)
local framehandle textArea2 = BlzCreateFrame("EscMenuTextAreaTemplate", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0,0)
local integer index = 1
call BlzFrameSetAbsPoint(textArea, FRAMEPOINT_TOPLEFT, 0.1, 0.5)
call BlzFrameSetAbsPoint(textArea2, FRAMEPOINT_TOPLEFT, 0.5, 0.5)
call BlzFrameSetSize(textArea, 0.25, 0.25)
call BlzFrameSetSize(textArea2, 0.25, 0.25)
loop
exitwhen index == 120
call BlzFrameAddText(textArea, I2S(index)+": Test Text")
call BlzFrameAddText(textArea2, I2S(index)+": Test Text")
set index = index + 1
endloop
endfunction
//===========================================================================
function InitTrig_Create_TextAreaTemplates takes nothing returns nothing
call BlzLoadTOCFile( "war3mapImported\\Templates.toc" )
call TimerStart(CreateTimer(), 0.0, false, function CreateDefaultTextAreas)
endfunction
Примечание переводчика: я чего-то не смог запустить такой код jass выше. Ведь сами fdf-files, откуда вызываются, не загружаются в игру. Как бы не старался, пробовал менять разные вариации fdf-кода в самом файле.
Вот, что получилось в импортном fdf-file. MyTextAreaTemplate1 и MyTextAreaTemplate2 - это перемеименованные BattleNetTextAreaTemplate и EscMenuTextAreaTemplate
fdf код TEXTAREA
Frame "TEXTAREA" "MyTextAreaTemplate1" {
//DecorateFileNames,
//FrameFont "MasterFont", 0.011, "",
TextAreaLineHeight 0.015,
TextAreaLineGap 0.0,
TextAreaInset 0.01,
TextAreaScrollBar "EscMenuTextAreaScrollBarTemplate",
Frame "SCROLLBAR" "EscMenuTextAreaScrollBarTemplate" INHERITS WITHCHILDREN "EscMenuScrollBarTemplate" {
}
ControlBackdrop "EscMenuTextAreaBackdropTemplate",
Frame "BACKDROP" "EscMenuTextAreaBackdropTemplate" INHERITS "EscMenuControlBackdropTemplate" {
}
}
Frame "TEXTAREA" "MyTextAreaTemplate2" {
//DecorateFileNames,
//FrameFont "MasterFont", 0.011, "",
TextAreaLineHeight 0.015,
TextAreaLineGap 0.0,
TextAreaInset 0.01,
TextAreaScrollBar "BattleNetTextAreaScrollBarTemplate",
Frame "SCROLLBAR" "BattleNetTextAreaScrollBarTemplate" INHERITS WITHCHILDREN "BattleNetScrollBarTemplate" {
}
ControlBackdrop "BattleNetTextAreaBackdropTemplate",
Frame "BACKDROP" "BattleNetTextAreaBackdropTemplate" INHERITS "BattleNetControlBackdropTemplate" {
}
}
В самом коде jass мне пришлось вызывать MyTextAreaTemplate1 и MyTextAreaTemplate2
код
function CreateDefaultTextAreas takes nothing returns nothing
local framehandle textArea = BlzCreateFrame("MyTextAreaTemplate1", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0,0)
local framehandle textArea2 = BlzCreateFrame("MyTextAreaTemplate2", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0,0)
local integer index = 1
call BlzFrameSetAbsPoint(textArea, FRAMEPOINT_TOPLEFT, 0.1, 0.5)
call BlzFrameSetAbsPoint(textArea2, FRAMEPOINT_TOPLEFT, 0.5, 0.5)
call BlzFrameSetSize(textArea, 0.25, 0.25)
call BlzFrameSetSize(textArea2, 0.25, 0.25)
loop
exitwhen index == 120
call BlzFrameAddText(textArea, I2S(index)+": Test Text")
call BlzFrameAddText(textArea2, I2S(index)+": Test Text")
set index = index + 1
endloop
endfunction
//===========================================================================
function InitTrig_Create_TextAreaTemplates takes nothing returns nothing
call BlzLoadTOCFile( "war3mapImported\\Templates.toc" )
call TimerStart(CreateTimer(), 0.0, false, function CreateDefaultTextAreas)
endfunction
Seting text of a TextArea
Чтобы установить текст текстового поля, используется BlzFrameAddText (textArea, newLine) или BlzFrameSetText (textArea, totalText). BlzFrameAddText добавляет разделитель строки перед новым добавленным текстом, если TextArea уже содержал текст. Для TextArea BlzFrameGetText кажется довольно непостоянным, через 1 секунду он возвратил null, в то время как он возвращал общий текст в той же функции, что и текст. набор. Я не так много тестировал. TextArea может отображать цветной текст с использованием warcraft color-format | cffff0000.
Screen-Space and Scrolling (экранное пространство и прокрутка)
По умолчанию TextArea будет улавливать предоставленное ему экранное пространство, делая его недоступным для игрового мира, т.е. нельзя ничего делать в пределах TextArea. А также предоставляет возможность перемещать ползунок Scrollbar мышью.
Можно отключить TextArea, чтобы TextArea не принимала ввод с помощью мыши, что снова сделало бы пространство экрана пригодным для игры, но это также отключило бы перемещение ползунка мышью. Можно по-прежнему прокручивать, когда мышь указывает прямо на полосу прокрутки. Отключение выполняется с помощью:
call BlzFrameSetEnable(textArea, false)
пример TextArea с pdf
fdf код
IncludeFile "UI\FrameDef\UI\EscMenuTemplates.fdf", //Frames from that fdf can be inherited in this file
IncludeFile "UI\FrameDef\UI\QuestDialog.fdf",
Frame "TEXTAREA" "MyTextArea" {
DecorateFileNames,
FrameFont "InfoPanelTextFont", 0.020, "",
TextAreaLineHeight 0.018, //Should fit used font Size, a high difference shows no text or much space between lines.
TextAreaLineGap 0.00, //adds that much space between 2 Lines, addtional to TextAreaLineHeight.
TextAreaInset 0.035, //Moves the Text and the scrollbar into the middle from all sides by this amount. This increases the min size for game crash.
TextAreaMaxLines 20, //Only that amount of lines are displayed, if more lines are added oldest are removed.
TextAreaScrollBar "MyTextAreaScrollBar",
Frame "SCROLLBAR" "MyTextAreaScrollBar" INHERITS WITHCHILDREN "EscMenuScrollBarTemplate" {
}
ControlBackdrop "MyTextAreaBackdrop",
Frame "BACKDROP" "MyTextAreaBackdrop" INHERITS "QuestButtonBaseTemplate" {
}
}
оass Code creating MyTextArea:
function CreateMyTextArea takes nothing returns nothing
local framehandle textArea = BlzCreateFrame("MyTextArea", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0),0,0)
local integer index = 1
call BlzFrameSetAbsPoint(textArea, FRAMEPOINT_CENTER, 0.4, 0.3)
call BlzFrameSetSize(textArea, 0.25, 0.25)
loop
exitwhen index == 120
call BlzFrameAddText(textArea, I2S(index)+": Test Text")
set index = index + 1
endloop
endfunction
//===========================================================================
function InitTrig_Create_MyTextArea takes nothing returns nothing
call BlzLoadTOCFile( "war3mapImported\\MyTextArea.toc" )
call TimerStart(CreateTimer(), 0.0, false, function CreateMyTextArea)
endfunction
можно фон поменять QuestBackdrop и EscMenuBackdrop
Inherited TextArea
Если вас в целом устраивает TextArea, и вам нужны только небольшие изменения, например, другой размер текста. Тогда можно было бы унаследовать от желаемого TextArea и указать только измененный размер текста. Таким образом можно получить маленькие (по определению) мощные и все еще действующие фреймы.
Это могло выглядеть так
Это могло выглядеть так
код
IncludeFile "UI\FrameDef\glue\battlenettemplates.fdf", //Frames from that fdf can be inherited in this file
Frame "TEXTAREA" "BigBnetTextArea" INHERITS WITHCHILDREN "BattleNetTextAreaTemplate" {
DecorateFileNames,
FrameFont "MasterFont", 0.020, "",
TextAreaLineHeight 0.015,
}
«BigBnetTextArea» в основном является «BattleNetTextAreaTemplate», но имеет больший размер TextSize, а строки больше, чтобы лучше соответствовать увеличенному тексту. Чтобы унаследовать дочерние фреймы фрейма, после INHERITS добавляется WITHCHILDREN. В кодовом случае нельзя получить доступ к унаследованным дочерним фреймам с помощью BlzGameFrameBy. С выпуском собственного BlzFrameGetChild в V1.32.6 можно получить унаследованные дочерние кадры во время выполнения, в 1.32.6 этот собственный игнорирует String