Собственно луашный хинт претендующий на некоторую полноценность. На данный момент доведено до состояния "вроде что-то работает". Было бы очень хорошо, если кто-то потестил. Сам я хинтом практически никогда не пользуюсь так, что тестить мне его в реальных условиях сложновато, но люди время от времени просят.
Использование:
Код
local hint = require[[hint]]
hint_obj = hint(ваш_конфиг) -- вывести сообщение. Описание cfg{} ниже. Вернет hint_obj.
hint_obj = hint.hide() -- скрыть сообщение. Вернет hint_obj.
hint.destroy() -- уничтожить поток с сообщением.
Окно можно таскать мышкой, повторые вызовы будут в тех же координатах, куда вы поместили окно. При нажатии правой кнопкой мыши - позиция будет восстановлена.
cfg - таблица с параметрами окна, сообщения. Все параметры являются опциональными, если они не будут указаны, то будут загружены значения по умолчанию.
cfg.text = "0a123456789abcT" -- текст сообщения
cfg.font = "Arial" -- название шрифта который будет использован.
cfg.font_size = 36 -- размер шрифта
cfg.font_color = 0xcc6020 -- цвет шрифта
cfg.font_alpha = 255 -- прозрачность шрифта
cfg.bold = 700 -- насколько жирным делать шрифт. Стандартно 100-900 с шагом 100.
cfg.anchor = "bottom_left" -- якорь от которого считать pox_x, pos_y. Размер окна может быть разным из-за разного текста, и если мы хотим, например,
видеть окно в правом нижнем углу, то мы можем задать, что окно должно "заканчиваться" в этих координатах, а не начинаться. top_left/top_right/bottom_left/bottom_right.
cfg.align_h = "right" -- выравнить текст по горизонтали. left/right/center
cfg.align_v = "center" -- выровнить текст по вертикали. top/bottom/center
cfg.pos_x = 300 -- позиция на экране x
cfg.pos_y = 300 -- позиция на экране y
cfg.width = 0 -- ширина. 0 - подгонит под размер текста
cfg.height = 50 -- высота. 0 - подгонит под размер текста
cfg.border_h = 0.15 -- размер горизонтального поля. При >-1 и <1 создаст поле пропорционально шрифту. При значениях больше - поле в пикселях
cfg.border_v = -5 -- размер вертикального поля. При >-1 и <1 создаст поле пропорционально шрифту. При значениях больше - поле в пикселях
cfg.bg_color = 0x40A65C -- цвет фона
cfg.bg_alpha = 220 -- прозрачность фона
cfg.sticky = 20 -- Расстояние на котором прилеплять окно к краю экрана при перемещении мышкой.
cfg.timeout = 1000 -- время жизни окна в мс (1000 = 1 сек).
hint поддерживает вывод нескольких сообщений одновременно. Для дальнейшего понимания его работы необходимо немного углубиться в его структуру:
hint - это массив с объектами которые выводят сообщения. Каждый объект является независимым от других и запущен в отдельном потоке.
Каждый из этих объектов имеет методы: hint(), hide(), destroy().
По умолчанию во время запуска созадется объект default и добавляет несколько ссылок для упрощенного вызова.
hint() - это hint.default() -> hint.default.hint()
hint.default() - это hint.default.hint()
hint.hide() - это hint.default.hide()
hint.destroy() - это hint.default.destroy()
local hint_obj = hint.default.hint()
hint_obj - это hint.default
-- соответственно вызов:
local hint_obj = hint.name()
-- создаст:
hint_obj = hint.name
hint_obj() = hint.name()
hint_obj.hint() = hint.name.hint()
hint_obj.hide() = hint.name.hide()
hint_obj.destroy() = hint.name.destroy()
Для вызова еще одного окна одновременно достаточно вызвать:
local second_hint = hint.name(ваш_конфиг)
Вместо "name" укажите любое незанятое имя (default, hide, destroy заняты сразу после старта).
Из известных проблем:
1) При повторном вызове хинта может быть на мгновение отображено прошлое состояние. Почему - не знаю. Я сначала перерисовываю окно, потом делаю hint, но оно все равно на один фрейм шансово показывает старое изображение.
2) При повторных вызовах на один первый фрейм может исчезнуть текст.
3) Бэкраунд и текст являются двумя разными окнами. Устанавливать прозрачность фона отдельно от прозрачности текста при использовании одного окна не получилось.
4) Не работает стандартный флаг вертикального выравнивания текста. Написан костыль реализующий этот функционал.
5) Окно хинта стартует в подвисшем состоянии (часики при наведении). Отмирает если навести на него мышку, убрать. Причины данного поведения мне не ясны. Фикшу путем вызова user32.SendMessageA(window, WM_SETCURSOR , 0, 0).
6) Если тащите окно и в это время был повторный вызов - окно переместится.
7) cdef содержит кучу мусора. При релизе почищу.
По факту это мой первый хоть сколько-то объемный код с использование winapi и работой с окнами в частности. Я не сомневаюсь, что там куча кривых моментов. С удовольствием выслушаю, как надо было.
пример вызова
Код
--lua
local hint = require[[hint]]
hint()
wait(300)
cfg = {}
cfg.font_size = 72
cfg.border_h = 0.15
cfg.border_v = -5
cfg.text = "ZZZZZZZZZZZZZZ"
cfg.pos_x = 600
cfg.pos_y = 600
cfg.width = 0
cfg.height = 0
cfg.bg_color = 0x990099 --math.random(0xffffff)
cfg.bg_alpha = 100
cfg.bold = 700
cfg.font = "Courier New"--"Courier New"
cfg.font_color = 0x999999 --math.random(0xffffff)
cfg.font_alpha = 170
cfg.align_h = "center"
cfg.align_v = "center"
cfg.sticky = 20
cfg.anchor = "bottom_left"
cfg.timeout = 5000
print"hint call"
local second = hint.second(cfg)
print("second", second)
wait(300)
second.hide()
second.destroy()
wait(300)
print("second second call", second)
second = hint.second(cfg)
wait(300)
print("second second hide", second)
second.hide()
--C.Sleep(1000)
cfg = {}
cfg.font_size = 72
cfg.border_h = 0.15
cfg.border_v = -5
cfg.text = "AAAAAAAAAAAAAA"
cfg.pos_x = 300
cfg.pos_y = 300
cfg.width = 0
cfg.height = 0
cfg.bg_color = 0x000099 --math.random(0xffffff)
cfg.bg_alpha = 30
cfg.bold = 700
cfg.font = "Courier New"--"Courier New"
cfg.font_color = 0x009900 --math.random(0xffffff)
cfg.font_alpha = 170
cfg.align_h = "center"
cfg.align_v = "center"
cfg.sticky = 20
cfg.anchor = "bottom_left"
cfg.timeout = 2000
print"hint.y"
hint.y(cfg)
C.Sleep(20000)
Сообщение отредактировал DarkMaster - 27.10.2024, 3:19