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

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

Содержание:
список констант событии фреймов frameeventtype
FRAMEEVENT_CONTROL_CLICK = ConvertFrameEventType(1)
FRAMEEVENT_MOUSE_ENTER = ConvertFrameEventType(2)
FRAMEEVENT_MOUSE_LEAVE = ConvertFrameEventType(3)
FRAMEEVENT_MOUSE_UP = ConvertFrameEventType(4)
FRAMEEVENT_MOUSE_DOWN = ConvertFrameEventType(5)
FRAMEEVENT_MOUSE_WHEEL = ConvertFrameEventType(6)
FRAMEEVENT_CHECKBOX_CHECKED = ConvertFrameEventType(7)	
FRAMEEVENT_CHECKBOX_UNCHECKED = ConvertFrameEventType(8)
FRAMEEVENT_EDITBOX_TEXT_CHANGED = ConvertFrameEventType(9)
FRAMEEVENT_POPUPMENU_ITEM_CHANGED = ConvertFrameEventType(10)
FRAMEEVENT_MOUSE_DOUBLECLICK = ConvertFrameEventType(11)
FRAMEEVENT_SPRITE_ANIM_UPDATE = ConvertFrameEventType(12)	
FRAMEEVENT_SLIDER_VALUE_CHANGED = ConvertFrameEventType(13)
FRAMEEVENT_DIALOG_CANCEL = ConvertFrameEventType(14)
FRAMEEVENT_DIALOG_ACCEPT = ConvertFrameEventType(15)
FRAMEEVENT_EDITBOX_ENTER = ConvertFrameEventType(16)
Объяснение этих констант:
FRAMEEVENT_CONTROL_CLICK - при активации фрейма либо отпусканием левой кнопки мыши (исходный щелчок мыши должен быть внутри кнопки), либо когда фрейм имеет фокус и нажимается пробел или ввод / возврат. Это Событие происходит до FRAMEEVENT_MOUSE_UP. То есть раньше происходит клик, а потом отпускание. К сожалению, клик реагирует только когда отпускаешь фрейм. Нет никакой реакции на нажимание фрейма. Но это не точно. зависит от типов фрейма. Не у всех есть down и up.
FRAMEEVENT_MOUSE_ENTER - Курсор мыши входит в фрейм. Реакция наведения мыши на курсор. Можно отключить, и сразу включить фрейм, чтобы проверить лежит ли курсор внутри фрейма. Что-то мне подсказывает, что фиксирует только заход, а не то, что он внутри. В последнем патче 1.33 это событие изменено: ранее фиксировало только заход внутрь, теперь ежесекудно фиксирует положение курсора внутри фрейма. Вроде здорово, но на этом все
FRAMEEVENT_MOUSE_LEAVE - Курсор мыши выходит из фрейма. Фиксрует покидание фрейма. В патче 1.33 это событие не работает почему-то. Теперь сложно отслеживать положение курсора на экране интерфейса. Либо ждем исправление или меняем механику. Могу заметить, что события Mouse Enter было достаточно для работы, но изрядно придеться попотеть
FRAMEEVENT_MOUSE_WHEEL - происходит, когда курсор мыши находится над фреймом, и колесо прокручено. Направление прокрутки можно определить в событии, установив флажок BlzGetTriggerFrameValue
Обычно выдает два результата:
120 -> Forward (если колесиком вверх крутанули)
-120 -> Backwards (если колесик опущен вниз)
Я бы проверил: на значение больше 0 или меньше 0, этого достаточно.
Сначала, думал, что значение возвращает градусы вращения колесом (сейчас не уверен). Казалось, что так круто. Но в настоящий момент убедился, что события выдают только два значения: 120 (вверх) или -120 (вниз), и событие не фиксирует маленькие вращения колеса, только часть оборота колеса, наверн 120 град (возможна ошибаюсь). Можно ли получить другие, пока не ясно. Пробовал менять шаг step, размеры min/max, значения value. Кто-то советовал скроллбар брать. Но это работает у большинства типов фреймов, а не только у скроллбар. Можно ли получать другие результаты неизвестно, но мне кажется этого достаточно. Работает только над фреймом.
FRAMEEVENT_CHECKBOX_CHECKED - когда включен флаг (галочка). Работает у таких фреймов как CheckBox (кнопка с флагом).
FRAMEEVENT_CHECKBOX_UNCHECKED - когда флаг (галочка) снято у CheckBox.
FRAMEEVENT_POPUPMENU_ITEM_CHANGED - пользователь выбрал параметр в контекстном меню POPUPMENU. В этом меню вложены отдельные кнопки MENU, когда игрок жмет на какую-то ячейку, то всплывает номер. Список обычно указан в fdf-file, и пронумерованы в таком порядке, в каком там указаны. BlzGetTriggerFrameValue сообщает вам номер, точнее, какая ячейка прожата.
FRAMEEVENT_EDITBOX_TEXT_CHANGED - когда изменяется текст в EditBox. Когда вы нажимаете на фрейм EDITBOX, открывается текстовое окно, где можете вводить текст. При вводе текста у вас отображается изменение строки EditBox. Происходит это при редактировании текста игроком: добавлении / удалении текста игроком, или кодом (установка синхронизированного текста вызовет одно событие для каждого игрока). BlzGetTriggerFrameText, чтобы получить text GetTriggerPlayer внутри своего поля
FRAMEEVENT_EDITBOX_ENTER - Нажатие кнопки ввода / возврата, когда фрейм находится в фокусе. Когда вы нажимаете на фрейм EDITBOX, открывается текстовое окно, где можете вводить текст. Т.е. клавиатура сфокусирована на ввод текста. Но можно нажать на Enter, и у вас срабатывает событие. Якобы нажатия. Но Enter не закрывает текстовое окно, явно нужно это триггером закрыть. BlzGetTriggerFrameText, чтобы получить text GetTriggerPlayer внутри своего поля
FRAMEEVENT_SLIDER_VALUE_CHANGED - у слайдера и скроллбара есть шкала, или полоса. Можно задать мин и максимальный размер, где будет ходить ползунок/полоса. У фрейма должен быть тек размер value, или точнее положение, где находится сам фрейм. Когда игрок крутить ползунок или полосу, событие фиксирует изменение значения. BlzGetTriggerFrameValue() отображается изменение полосы
FRAMEEVENT_MOUSE_UP - работает при отпускание кнопки, или фрейма. Тут не только кнопка, по той же схеме работают большинство типов фреймов
FRAMEEVENT_MOUSE_DOWN - это событие по идее должно было работать при нажимании фрейма. Но! Оно не работает ни у одного фрейма. По каким то причинам, это событие выключили близзарды.
далее пойдут события, которые плохо изучены. И практически не применяются мной:
FRAMEEVENT_DIALOG_CANCEL - При активации кнопки отмены Dialog
FRAMEEVENT_DIALOG_ACCEPT - При активации кнопки принятия Dialog
FRAMEEVENT_MOUSE_DOUBLECLICK -по идее это какой то двойной клик, но такого события нет ни у одного фрейма. То есть оно ни у кого не работает
FRAMEEVENT_SPRITE_ANIM_UPDATE - по идее это должно быть у спрайта показывать анимацию. Спрвйт имеет свойство проигрывать цикличную анимацию.
это нативные константы, данные которых передают по событию:
BlzGetTriggerFrame returns framehandle
BlzGetTriggerFrameEvent returns frameeventtype
BlzGetTriggerFrameValue returns real
BlzGetTriggerFrameText  returns string
GetTriggerPlayer  returns player

Какими FrameEvents могут обладать перечисленные FrameType?

Если просто кто-то захочет создать фрейм, но не знает какое событие может реагировать на ваш фрейм. Для удобства убрана приставка FRAMEEVENT_
список типов фреймов
BACKDROP
None​
BUTTON
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL (CONTROL_CLICK with BlzFrameClick)​
CHATDISPLAY
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL (CONTROL_CLICK with BlzFrameClick)​
CHECKBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL, CHECKBOX_CHECKED, CHECKBOX_UNCHECKED (CONTROL_CLICK with BlzFrameClick)​
CONTROL
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP​
DIALOG
DIALOG_CANCEL, DIALOG_ACCEPT​
EDITBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL, EDITBOX_TEXT_CHANGED, EDITBOX_ENTER (CONTROL_CLICK with BlzFrameClick)​
FRAME
None, (Blocks previous created Frames of Level 0)​
GLUEBUTTON
CONTROL_CLICK, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
GLUECHECKBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL, CHECKBOX_CHECKED, CHECKBOX_UNCHECKED (CONTROL_CLICK with BlzFrameClick)​
GLUEEDITBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL, EDITBOX_TEXT_CHANGED, EDITBOX_ENTER (CONTROL_CLICK with BlzFrameClick)​
GLUEPOPUPMENU
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_WHEEL, CONTROL_CLICK, POPUPMENU_ITEM_CHANGED​
GLUETEXTBUTTON
CONTROL_CLICK, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
HIGHLIGHT
None​
LISTBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
MENU
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
MODEL
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL (CONTROL_CLICK with BlzFrameClick)
(Only in the screen space taken, this has nothing to do with the visual part)​
POPUPMENU
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_WHEEL, CONTROL_CLICK, POPUPMENU_ITEM_CHANGED​
SCROLLBAR
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL, SLIDER_VALUE_CHANGED​
SIMPLEBUTTON
CONTROL_CLICK​
SIMPLECHECKBOX
None​
SIMPLEFRAME
None​
SIMPLESTATUSBAR
None​
SLASHCHATBOX
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL, EDITBOX_TEXT_CHANGED, EDITBOX_ENTER (CONTROL_CLICK with BlzFrameClick)​
SLIDER
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL, SLIDER_VALUE_CHANGED (CONTROL_CLICK with BlzFrameClick)​
SPRITE
None​
TEXT
CONTROL_CLICK, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
TEXTAREA
MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
TEXTBUTTON
CONTROL_CLICK, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
TIMERTEXT
CONTROL_CLICK, MOUSE_ENTER, MOUSE_LEAVE, MOUSE_UP, MOUSE_WHEEL​
Дебаг код для отслеживания всех событии фреймов
кратко: знаю, что можно код покороче и получше. Но если нужно потестить фрейм, и проверить. Бывает лень для каждой карты писать километровые коды. Здесь я просто пытался проверять какие фреймовые события срабатывают у каждого типа фрейма. Проверял отличия и пр. А также проверял как работают изображения, тут у фреймов по два типа изображения (активное и выключенное, заданное в ControlStyle). Некоторые выключенные изображения трудно проверить, поэтому когда курсор мыши попадал в фрейм, я его выключал - так можно было увидеть второе изображение. И еще что вам стоит знать - у выключенных фреймов перестают работать события - поэтому вам стоит это учесть.
код
--@param framehandle frameA
function DebugFrame(frameA)
                            
    --1
    local T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_CONTROL_CLICK)
    TriggerAddAction(T, function()
       print("CONTROL_CLICK")
    end)
    --2 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_MOUSE_ENTER)
    TriggerAddAction(T, function()
       print("MOUSE_ENTER") 
    end)
    --3 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_MOUSE_LEAVE)
    TriggerAddAction(T, function()
       print("MOUSE_LEAVE")
    end)
    --4 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_MOUSE_UP)
    TriggerAddAction(T, function()
       print("MOUSE_UP")
    end)
    --5 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_MOUSE_DOWN)
    TriggerAddAction(T, function()
       print("MOUSE_DOWN")
    end)
    --6 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_MOUSE_WHEEL)
    TriggerAddAction(T, function()
       print("MOUSE_WHEEL")
    end)
    --7 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_CHECKBOX_CHECKED)
    TriggerAddAction(T, function() 
       print("CHECKBOX_CHECKED")
    end)
    --8 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_CHECKBOX_UNCHECKED)
    TriggerAddAction(T, function()
        print("CHECKBOX_UNCHECKED")
    end)
    --9 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_EDITBOX_TEXT_CHANGED)
    TriggerAddAction(T, function()
        print("EDITBOX_TEXT_CHANGED: "..BlzGetTriggerFrameText())
    end)
    --10 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_POPUPMENU_ITEM_CHANGED)
    TriggerAddAction(T, function()
       print("POPUPMENU_ITEM_CHANGED")
    end)
    --11 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_MOUSE_DOUBLECLICK)
    TriggerAddAction(T, function()
       print("MOUSE_DOUBLECLICK")
    end)
    --12 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_SPRITE_ANIM_UPDATE)
    TriggerAddAction(T, function()
       print("SPRITE_ANIM_UPDATE")
    end)
    --13 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_SLIDER_VALUE_CHANGED)
    TriggerAddAction(T, function()
       print("SLIDER_VALUE_CHANGED: "..R2S(BlzGetTriggerFrameValue() )) 
    end)
    --14 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_DIALOG_CANCEL)
    TriggerAddAction(T, function()
       print("DIALOG_CANCEL")
    end)
    --15 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_DIALOG_ACCEPT)
    TriggerAddAction(T, function()
       print("DIALOG_ACCEPT")
    end)
    --16 
    T = CreateTrigger()
    BlzTriggerRegisterFrameEvent(T, frameA, FRAMEEVENT_EDITBOX_ENTER)
    TriggerAddAction(T, function()
       print("EDITBOX_ENTER: "..BlzGetTriggerFrameText())
    end)
end
Какие типы фреймов являются некликабельными?
кратко: иногда нам нужно создавать такие фреймы, через которых можно было кликнуть по кнопке или другим объектам. Например, вам нужно поверх кнопки указать текст, который показывает число зарядов или кол-во перезарядки. Или поверх в углу кнопки установить иконку-рамку к зарядам. Или по объектам, лежащих на карте. Можно еще отслеживать положение мыши через невидимые frame-пустышки (там маленькая хитрость с BlzFrameSetTooltip), и через эти фреймы можно кликать по объектам на экране. У таких типов фреймов как правило отсутствуют какие то события, и на них нельзя крепить подсказки (кроме frame, simpleframe).

Backdrop - можно создать некликабельную текстуру. Этот фрейм легко дает кликать через себя по объектам по карте или по кнопкам. К нему еще нельзя прикрепить подсказки. BACRDROP не имеет никаких событии.
Text - текст сам по себе кликабельный. Имеет невидимую рамку с размерами ширины и высоты. Не дает кликать через себя. Можно в кнопке использовать ButtonText, она отключает события клика по Text. И сам фрейм TEXT становится текстом для текстовой кнопки. Если создать фейковую тестовую кнопку за пределами экрана, а сам текст привязать к переменной BlzGetFrameByName ("MyText", 0), и передвинуть в пределах экрана текст. Сам текст становится некликабельным. Но явный изврат. TEXT может иметь различные Frameevents и будет контролировать пространство экрана, занимаемое его размером или отображаемым текстом (короче в этой прямоугольной области никак нельзя кликнуть по кнопке или по другим объектам за TEXT). Если кто-то этого не хочет, можно отключить TEXT-Frame с помощью BlzFrameSetEnable(frame, false). Если Text задан ControlStyle (ButtonText), это задают обычно для текста кнопки, тут убирают у Text Control за экраном, но одновременно добавляют тексту разные реакции когда кнопка подсвечивается при наведении курсором мыши - цвет/шрифт меняет текст, или при выключении кнопки - текст становится серым (тут опять цвет/шрифт). Тут может быть так, что Text изменит цвет при отключении. Не путайтесь!!! это если ваш Text зависим от одной fdf-функции кнопки - ButtonText, и создается вместе с кнопкой. Но если создавать отдельно независимый TEXT, то таких проблем с авто-изменением цвета/шрифта не должно быть. ButtonText работает только строго с кнопкой, отдельно существовать такая реакция не может.
FRAME - невидимая пустышка, у которой совсем нет никаких событии. И она конечно некликабельна. Но на нее можно вешать подсказки или использовать саму как подсказку, задавать всяких потомков. И использовать как контейнер, но конечно щас говорим не об этом. Можно задавать размеры, и с помощью таймера и подсказки узнавать лежит ли в этой область курсор . Аналогично можно использовать и SIMPLEFRAME.
STRING - это simple frame. можно создать текст, но для этого нужно запихать его внутрь какого-нибудь главного фрейма как в качестве родителя. Например, внутри SIMPLEFRAME ссылка
TEXTURE - это simple frame. можно создать текстуру, здесь также аналогично нужно создать его внутри какого-нибудь simpleframes. Например, внутри SIMPLEFRAME, SIMPLEBUTTON
любой другой фрейм можно наверное сделать некликабельным, просто выключив по примеру TEXT. Но таким образом отключаете работу событии триггера. Но мне достаточно имеющих фреймов выше.

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
1 год назад
Отредактирован MpW
0
На хайве нвшли решение бага ивентам после патча 1.33. Но сам не проверял еще. Проблема скорее всего, по словах Берги, в pdf, а не ивентах
1
32
1 год назад
1
в pdf,
в fdf ты хотел сказать

Но сам не проверял еще
я проверил, всё так же мигает, хотя нет ложных эвентов входа выхода, судя по принтам, но рельано ложные эвенты ещё Hate победил, ну и я понял его способ, по факту решение - запоминаем последний фрейм в переменную, и в событии входа его проверяем.
+ в этой теме на хайве используется дефолты fdf
UI\FrameDef\Glue\BattleNetTemplates.fdf
следовательно проблемы дёрганий всё теже
1
32
1 год назад
1
Если кто не понимает что за проблема, вот на видео видно, я держу курсор на кнопке, + а курсор улетает под пищу

Лол,
FRAMEEVENT_MOUSE_DOWN - это событие по идее должно было работать при нажимании фрейма. Но! Оно не работает ни у одного фрейма. По каким то причинам, это событие выключили близзарды.
а ты оказывается это знал, кстати FRAMEEVENT_MOUSE_UP сломали тоже , недавно чинил пеонов, заменил событие на FRAMEEVENT_CONTROL_CLICK.
Просто фейспалм!!!!
Загруженные файлы
0
27
1 год назад
0
Фониус Персон, ну значит решения нет 🐒
0
32
1 год назад
0
Проверил на будущем ПТР - ничего не изменилось
0
23
11 месяцев назад
Отредактирован Makeba
0
FRAMEEVENT_MOUSE_WHEEL
Но это работает у большинства типов фреймов, а не только у скроллбар.
Чёт сейчас на 1.36 у меня он только над скроллбарами и работает. И то криво, со сдвигом курсора на один кадр во время прокрутки
0
27
11 месяцев назад
Отредактирован MpW
0
poisoNDealer, ну вроде работало раньше, сейчас неизвестно, я вже не сижу в варкрафте давно. Например, у меня даже на текстах работало или на кнопках событие прокрутки мыши. Пример, та. Text использоваласб в строительстве для прокрутки здания. Но свои анализы ориентировал на данные из хайва
Чтобы оставить комментарий, пожалуйста, войдите на сайт.