Цитата:
Сообщение от dr_cannabis
Господа, объясните идиоту, уже 2 часа мучаюсь, но понять никак не могу! Как организована функция удержания кнопки, где и как считаеться время нажатия, если можно на примере с одной переменной!
|
да все просто очень на самом деле :-)
Там цикл, который реагирует на любое изменение координат осей.
Вот мой главный цикл
Loop
{
; Читаем состояние кнопок. Если кнопарь нажат, то переменная button(№кнопки)= D
Loop, %joy_buttons%
{
GetKeyState, button%a_index%, %JoystickNumber%joy%a_index%
}
; Читаем показания оси Х - по сути основных кнопок жостика
GetKeyState, joyx, %JoystickNumber%JoyX
GetKeyState, joyz, %JoystickNumber%joyZ
;ToolTip, %joyx%
if (joyx<>"") and((joyx<>prev_joyx) or (joyz<>prev_joyz))
{
; если состояние джойстика изменилось
if (prev_joyx <> joyx_default) or (prev_joyz<>joyz_default)
{
; если было не дефолтное положение - считаем, что прошлое положение отпущено, вызываем обработчик.
res_button_released( prev_joyx , prev_joyz , timer)
}
timer = 0
prev_joyx := joyx
prev_joyz := joyz
if (joyx <> joyx_default) or (joyz<>joyz_default)
{
; Если новое положение не дефолтное, то вызываем обработчик нажатия и начинаем счет времени
res_button_pressed(joyx, joyz, timer)
}
}
else
{
if (joyx <> joyx_default) or (joyz<>joyz_default)
{
; если ничего не изменилось и положение НЕ дефолтное, то увеличиваем таймер на 1 и вызываем обработчик нажатия.
timer := timer + 1
res_button_pressed(prev_joyx, prev_joyz, timer)
}
}
Sleep, 50
}
0. То есть систему включили, у нее все по дефолту, ничего не происходит. далее:
1. Нажали кнопку. Начал вызываться обработчик нажатия. У него есть параметр Timer, который последовательно увеличивается. Если Timer=0, то кнопку только что нажали
2. Кнопку отпустили (или нажали что-то другое) Вызвался обработчик отпускания с параметром Timer, соответствующим времени нажатия на кнопку. Затем см пункт 0 или 1.
Теперь пишем обработчик для единственной кнопки
res_button_pressed(jx, jz , time_from_pressing)
{
global ; чтобы иметь доступ к глобальным переменным
if (jz = joyz_default) and (time_from_pressing = 0) ; то есть обрабатываем непосредственно нажатия, а не удерживания кнопок.
If (jx <= JKey_VOLU_max) and (jx>= JKey_VOLU_min) and ((time_from_pressing/5) = round(time_from_pressing/5))
{
SoundGet, master_volume
if time_from_pressing = 0
{
master_volume := master_volume*(1+(First_VolumeStep/100))
}
else
if time_from_pressing >= 15
{
master_volume := master_volume*(1+(Repeat_VolumeStep/100))
}
SoundSet, master_volume
}
}
Тут смысл такой - если только что нажали - меняем громкость на First_VolumeStep, а если ужерживаем - меняем на Repeat_VolumeStep каждые 5 циклов вызова, но если время от нажатия не менее 15.
Если же надо выполнять разные действия в зависимости от длительности - надо обрабатывать отпускание кнопки и по нему определять длинное или короткое нажатие, я чуть выше писал...
зы. Скопируй отсюда текст и расставь сдвиги вправо, чтобы понимать какой if на что действует, иначе непонятно... Я вставлял tab, но форум их съел :-(.