2013-06-13 4 views
0

У меня есть панель (панель2) внутри другой панели (панель1). Я хочу получить положение мыши на панели 1, но когда я перемещаю указатель мыши на панели2, следующий код перестает работать.получение позиции мыши различного управления

private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     label1.Text = "Offset: " + e.X + " x " + e.Y; 
    } 

Как я могу получить его, чтобы прочитать аргументы мыши, даже если мышь над панелью2? Благодаря!

EDIT: panel2 находится в центре x = 100, y = 100 панели1. если я перемещаю мышь на левый верхний угол панели2, он дает мне координаты, например, 1x1, где мне нужно располагать на панели 1, например 101x101

EDIT 2: Я не пытаюсь перетащить его, просто прочитайте координаты исходной панели (panel1), поэтому я могу рассчитать смещение для масштабирования панели2. Поэтому мне нужно только mousemove, больше ничего. Спасибо

+0

Вам не нужен обработчик для MouseMove на панели2? Этот обработчик запускается только панелью 1, когда вы находитесь над панелью2, она должна запускать собственное событие. Другими словами, событие расходуется, оно не будет автоматически возвращаться к родительскому. – DonBoitnott

+0

Вам нужно сделать это, только когда удерживается кнопка мыши? –

+0

Проблема в том, что я также назначаю событие panel2, он сообщает координаты мыши панели2, а не panel1. Мэтью, мне нужно только прочитать x y, когда мышь движется благодаря. – Kristian

ответ

0

Если вам нужно только делать это, когда кнопка мыши удерживается в нажатом положении (например, потому что вы отслеживаете перетаскивание и операцию или выбор уронить), то вы можете сделать следующее:

  1. В ваш обработчик MouseDown, звоните this.Capture = true;
  2. Теперь ваш обработчик MouseMove получит сообщения перемещения мыши, даже когда мышь находится над другим элементом управления.
  3. В вашем обработчике MouseUp позвоните this.Capture = false; - Примечание. Если вы забудете сделать это, другие элементы управления в том же процессе не получат никаких сообщений мыши.

Помимо этого, очень сложно получить сообщения MouseMove от других элементов управления, не добавляя обработчики мыши к этим другим элементам управления.

Главное, что this.Capture - это то, что вам нужно хорошее время, чтобы установить его в истинное и другое подходящее время, чтобы вернуть его в значение false. Как правило, это сделано в MouseDown и MouseUp, как я описал.

Однако, вы можете также конвертировать COORDS из panel2-относительно Panel1-относительно так:

Преобразования из panel2 на экран координат COORDS:

Point screenCoords = panel2.PointToScreen(mouseCoordInPanel2); 

Затем конвертировать из экрана в Panel1- координат относительные Coords:

Point mouseCoordInPanel1 = panel1.PointToClient(screenCoords); 

чтобы сделать это, вы должны были бы иметь обработчик MouseMove в panel2, где вы сделали это преобразование, и panel2 потребуется ссылка на Пан el1 для того, чтобы позвонить panel1.PointToClient()

0

Вы также должны назначить событие другой панели.

+0

, тогда он дает мне координаты панели2, а не там, где мышь расположена в панели 1. – Kristian

+0

Вы также можете использовать перемещение mosue по всей вашей форме. Эти координаты должны быть достаточно глобальными. Кстати, возможны и преобразования, такие как «ToScreenCoordinates» и так далее. – icbytes

0

Вы не можете поместить обработчик событий в панель2, а затем использовать свойства left/top панели 1 и панели 2, чтобы смещать положение мыши в панели2, чтобы получить нужное местоположение в панели 1?

+0

Правильно, также сохранял бы это – icbytes

0

Я также считаю, что назначение события на вторую панель было бы лучшим. Когда мышь находится на панели 1, координаты будут предоставлены напрямую; когда он находится на панели 2, они будут преобразованы путем учета относительных позиций между обеими панелями (довольно просто: изменение в положениях X/Y, значения, которые не требуют жесткого кодирования, но обновляются во время выполнения).

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