2015-10-01 2 views
0

Я новичок в WinForms, и у меня есть вопрос о событиях MouseDown и MouseUp (извините, если я их продублирую, но я не могу это сделать). Итак, у меня есть PictureBox и крася куб на нем. Но мне нужно повернуть его, используя мышь. Я использую автоматически созданные события MouseDown, MouseUp, MouseMove. Первый из них просто изменит переменную bool (это глупый способ проверить, но я не могу найти лучшего).Как поймать события кнопки мыши в другом потоке

private void PictureBox_MouseDown(object sender, MouseEventArgs e) 
    { 
     RMBIsPressed = true; 
    } 

    private void PictureBox_MouseUp(object sender, MouseEventArgs e) 
    { 
     RMBIsPressed = false; 
    } 

В MouseMove У меня есть сделать {} в то время как(), который проверяет состояние RMBIsPressed и перекрасить куб, если это необходимо.

private void PictureBox_MouseMove(object sender, MouseEventArgs e) 
    { 
     Point mousePoint = MousePosition; 
     Point mousePointNext; 
     do 
     { 
      mousePointNext = MousePosition; 
      if (mousePointNext != mousePoint) 
      { 
       if (mousePoint.X < mousePointNext.X) 
       { 
        teta += deltaTeta; 
       } 
       else 
       { 
        teta -= deltaTeta; 
       } 
       if (mousePoint.Y < mousePointNext.Y) 
       { 
        phi += deltaPhi; 
       } 
       else 
       { 
        phi -= deltaPhi; 
       } 
       PictureBox.Refresh();      
       ViewTransformation(); 
       DrawCube(); 
      } 
      mousePoint = MousePosition; 
     } while (RMBIsPressed); 
    } 

Когда MouseUp событие происходит в первый раз, все в порядке, но в следующей итерации RMBIsPressed по-прежнему верно, даже если я выпускаю юаней. Кажется, делает это, блокируя событие MouseUp. Мой вопрос: могу ли я создать другой поток, который будет захватывать события MouseUp и MouseDown и изменять значение RMBIsPressed? Если это возможно, скажите, пожалуйста.

+1

Почему у вас есть цикл в обработчике MouseMove? Этот обработчик вызывается каждый раз, когда мышь перемещается. Этот код, скорее всего, полностью заблокирует ваш пользовательский интерфейс. – vesan

ответ

2

Цикл do-while не позволяет обрабатывать события.

  • Переименовать mousePoint в lastPosition и сделать его переменной экземпляра.
  • Комплект lastPosition в MouseDown и в конце MouseMove.
  • Удалить do-while в MouseMove

Я хотел бы также изменить PictureBox.Refresh к PictureBox.Invalidate. Это позволит избежать мерцания, когда мышь движется очень быстро.

+0

Любые комментарии к дате голосования? –

+1

Не знаю, почему кто-то отказался от этого. Так оно и должно быть сделано. Вы также можете подумать о том, чтобы отметить 4-е, что код не проверяет, нажата ли кнопка _which_, но переменная кажется, что это то, что вам нужно. – theB

+0

Большое спасибо, это помогло. Странно, что «PictureBox.Invalidate» не очищает «PictureBox». Я рисую куб, используя 'Graphics.FromImage (PictureBox.Image)' и 'DrawLine'. – QuarK

-1

В конце вашего do {} звонок Application.DoEvents(). Это обработает сообщения Windows в буфере, что означает, что событие mouse up будет обработано. Вы также можете захватить мышь в мыши.

+2

См. Http://stackoverflow.com/a/5183623/431359, почему «DoEvents» - это зло. –

Смежные вопросы