none
захват мыши RRS feed

  • Вопрос

  • Работаю на C#.

    Разрабатываю приложение (есть атрибуты, присущие редактору векторной графики) со следующей идеей:

    1. пользователь мышью выбирает в canvas геометрическую фигуру.

    2. может мышью на панели кликнуть кнопку с нужной командой (или ввести имя команды с клавиатуры. есть специальная панелька улавливающая события клавиатуры). допустим команда "двигать"

    3. может мышью указать за какую точку передвигаем объект и конечную точку передвижения. А можно с клавиатуры указать величины смещения объекта по осям.

    Проблема в следующем (может для кого то и мелочь, я не смог разобраться):

    как в процессе ввода с клавиатуры запретить перемещения пользователем указателя мыши!!!??????????????????????

    Опробованные варианты:

    1. для объекта mouseEventArgs "e" события mouseMove проверил - все свойства только для чтения

    2. для Cursors при обработке события canvas_mouseMove для свойства position задаю координаты предыдущего положения мыши - курсор вылетает за пределы окна и не заходит в него. если  задаю координаты предыдущего положения мыши с учетом данных canvas.location - эффект тот же.

    PS может я чего то не знаю? 

    • Перемещено PashaPash 24 мая 2012 г. 9:52 (От:Работа в среде Visual Studio)

Ответы

  • Запретить пользователю вообще двигать мышь, на мой взгялд неправильно и делать так нежелательно, но если вы все хотите это сделать - то попробуйте варианты из Disabling mouse movement and clicks altogether in c#

    Проще сделать свой флаг "происходит ввод с клавиатуры" и в событиях MouseMove, на которые вы подписаны проверять этот флаг и просто не изменять/рисовать фигуру.


    Для связи [mail]

Все ответы

  • Попробуйте в событии MouseMove при проверке идет ли ввод с клавиатуры ставить e.Handled = True

    Мышь двигаться все равно будет, но объекты на ее передвижение реагировать не смогут


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • в том и сложность. в обработчике события canvas_mouseMove у объекта "e" нет свойства Handler (((((
  • Тогда вам нужно переопределить процедуру OnMouseMove и если реакция на мышь запрещена, то НЕ выполнять участок кода

    base.OnMouseMove(e);

    а если разрешена то выполнять.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Запретить пользователю вообще двигать мышь, на мой взгялд неправильно и делать так нежелательно, но если вы все хотите это сделать - то попробуйте варианты из Disabling mouse movement and clicks altogether in c#

    Проще сделать свой флаг "происходит ввод с клавиатуры" и в событиях MouseMove, на которые вы подписаны проверять этот флаг и просто не изменять/рисовать фигуру.


    Для связи [mail]

  • Идея в том, чтобы разделить клавиатурный ввод и ввод с использованием мыши, при сохранении максимума визуализации!

    Пример:

    линия с двумя "ручками" за которые можно ее изменить: либо пользователь перетаскивает ручку мышью, при этом постоянно отрисовывается новое положение линии; либо пользователь мышью выбрал ручку и начинает с клавиатуры вводить координаты. Во втором варианте координаты вводятся в текст бокс, появляющийся рядом с выбранной ручкой (кукрсором), при этом нужно либо скрыть курсор, либо сделать его не подвижным. Зачем разрешать пользователя в это время двигать мышью? во-первых, если текст бокс привязан к координатам мыши и двигается за ним, то вообще теряется понимание (зачем кусок коордитат следует за указателем), во-вторых, кусок координат висит рядом с выбранной ручкой, а пользователь уже передумал доделывать опирацию и тычит мышкой в другие объекты. Вывод: пусть вводит с клавиатуры данные до конца и клавиша энтер, либо пусть передумывает и жмет эскейп (снимается подсвечивание выбраной ручки, скрываются недовведенные данные, появляется курсор).

    Возражения...

    Эта идея реализована в приложении AutoCad, и это удобнее чев других векторных редакторах, где можно тыкать сколь угодно во время команд + подвисание приложения = потерялся что хотел сделать!!!

  • попробуйте варианты из  Disabling mouse movement and clicks altogether in c#



    Для связи [mail]

    вроде то, что нужно! пробую...
  • protected override void OnMouseMove(MouseEventArgs e)
    {
          if (commandData != null)
          {
                  if (commandData.IsMouseMove())
                 {
                         base.OnMouseMove(e);
                 }
           }
           else
           { 
                  base.OnMouseMove(e);   
           }
    }

    переопределил метод для формы в которой бегает курсор и рисуются объекты - курсор бегает все время и ничего не полчулось! может чего то не так?

    commandData - userControl, который появляется рядом с курсором для ввода с клавиатуры и отслеживает нажатые клавиши

     IsMouseMove() - возращает true, если текст введен и соответствует наименованию команды или числовому значению запрашиваемых данных + пользователь нажал клавишу enter, false - если введенные символы не имеют пока смысла


  • переопределил метод для формы в которой бегает курсор и рисуются объекты - курсор бегает все время и ничего не полчулось! может чего то не так?
    Это вариант что я вам предложил не запрещает двигать курсор и не прячет его, просто то контрол у которого вы переопределили OnMouseMove не будет реагировать на движение мыши. В качестве примера я сделал что бы в событии MouseMove в заголовок окна писалось положение мыши по координате X. Если я просто двигаю над формой, то ее заголовок все время меняется, но если я переопределяю OnMouseMove и прячу кусок кода base.OnMouseMove(e); то в заголовке формы не меняется, то есть она не реагирует на событие.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Хорошо, если это решит вашу проблему, то не забудьте отметить ответ. Спасибо.


    Для связи [mail]