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

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

Содержание:
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

fdf-функции для TextArea

TextAreaLineHeight
TextAreaLineHeight real,
Пример:
TextAreaLineHeight 0.018,
Высота строки, это значение должно как-то соответствовать размеру тексту / используемого шрифта.
TextAreaLineGap
extAreaLineGap real,
Пример:
TextAreaLineGap 0.00,
Короче, очень похоже на размер отступов между строками. Добавляет размер зазора между строками с учетом высоты строки TextAreaLineHeight
TextAreaInset
TextAreaInset real,
Пример:
TextAreaInset 0.035,
Перемещает текст и полосу прокрутки в середину со всех сторон на эту величину. Это увеличивает минимальный размер вылета игры.
TextAreaMaxLines
TextAreaMaxLines integer,
Пример:
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

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...