События от mouse wheel на элементах
От: PM  
Дата: 29.07.13 13:26
Оценка:
Всем привет,

Есть вопрос, наверно к Андрею.

В HTMLayout реализовано такое поведение — если событие прокрутки колесика мыши возникает на элементе с фокусом, то оно обрабатывается в этом элементе.

Так, для <input type="number"> это будет увеличение/уменьшение значения на step, в <select type="dropdown"> это будет выбор следующего/предыдущего элемента в списке.

Но вот, например, <input type="time"> (и вероятно, date) реагируют на mouse wheel даже если не имеют фокуса. Другие элементы, например с behavior: popup-selector просто игнорируют события от колесика мыши.

Можно ли это привести к какому-то одинаковому поведению?

Меня бы устроило и отсутствие реакции в элементах управления на колесико мыши. Для этого я пытался поставить обработчик на события мыши для всего документа и перехватывать их примерно таким способом:


BOOL my_event_handler::on_mouse(HELEMENT he, HELEMENT target, UINT event_type, POINT pt, UINT mouseButtons, UINT keyboardStates)
{
    if ( event_type == (MOUSE_WHEEL | SINKING) )
    {
        return true;
    }
    return false;
}


Но так естественно перестает работать прокрутка содержимого документа, что хотелось бы оставить.
Re: События от mouse wheel на элементах
От: c-smile Канада http://terrainformatica.com
Дата: 30.07.13 02:33
Оценка:
Здравствуйте, PM, Вы писали:

PM>Можно ли это привести к какому-то одинаковому поведению?


mouse wheel policy вообще-то унифицирована:

0. все mouse wheel события поступают главному htmlayout/sciter окну если оно само активное (имеет фокус внутри)
1. mouse wheel | sinking ловится и обрабатывается scrollable container'ом. Если такого нет то
2. необработанный mouse wheel поступает тому элементу над которым мышь находится.

PM>Меня бы устроило и отсутствие реакции в элементах управления на колесико мыши. Для этого я пытался поставить обработчик на события мыши для всего документа и перехватывать их примерно таким способом:

PM>Но так естественно перестает работать прокрутка содержимого документа, что хотелось бы оставить.

В принципе правильно, MOUSE_WHEEL задавили, но тогда надо (пере-)послать это событие нужному элементу:

virtual bool my_event_handler::handle_mouse(HELEMENT he, MOUSE_PARAMS& params ) 
{
  if ( event_type == MOUSE_WHEEL | SINKING )
  {
    BOOL handled;
    params.cmd = MOUSE_WHEEL;
    params.target = he;
    HTMLayoutTraverseUIEvent(HANDLE_MOUSE,&params,handled);
    return true;
  }
  return false;
}


(Предполагается что my_event_handler стоит на html или body или что там у тебя scrollable)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.