Как сделать элемент управления «прозрачным» для мыши или перенаправить событие MouseMove к родителю? - PullRequest
2 голосов
/ 31 мая 2009

Я хочу создать карточную игру. Я использую событие mousemove для перетаскивания карт через окно. Проблема в том, что если я наведу мышь на другую карту, она застрянет, потому что карта под курсором мыши получает события мыши, так что событие MouseMove окна не запускается.

Вот что я делаю:

 private void RommeeGUI_MouseMove(object sender, MouseEventArgs e)
 {
      if (handkarte != null)
      {
                handkarte.Location = this.PointToClient(Cursor.Position);
      }
 }

Я попробовал следующее, но не было никакой разницы:

SetStyle(ControlStyles.UserMouse,true);
SetStyle(ControlStyles.EnableNotifyMessage, true);

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

Ответы [ 3 ]

2 голосов
/ 31 мая 2009

Для этого вам необходимо отследить несколько вещей в вашем коде:

  1. На какую карту указывает мышь когда кнопка мыши нажата; это карта, которую вы хотите переместить (использовать событие MouseDown)
  2. Перемещение карты при перемещении мыши
  3. Остановите перемещение карты при отпускании кнопки мыши (используйте кнопку Событие MouseUp)

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

Быстрый пример (использование элементов управления Panel в качестве «карточек»):

Panel _currentlyMovingCard = null;
Point _moveOrigin = Point.Empty;
private void Card_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        _currentlyMovingCard = (Panel)sender;
        _moveOrigin = e.Location;
    }
}

private void Card_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && _currentlyMovingCard != null)
    {
        // move the _currentlyMovingCard control
        _currentlyMovingCard.Location = new Point(
            _currentlyMovingCard.Left - _moveOrigin.X + e.X,
            _currentlyMovingCard.Top - _moveOrigin.Y + e.Y);
    }
}

private void Card_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left && _currentlyMovingCard != null)
    {
        _currentlyMovingCard = null;
    }
}
1 голос
/ 09 апреля 2011

Что вы могли бы сделать, это отправить событие MouseDown в функцию event.function, которую вы хотите вызвать.

Скажем, у вас есть "Метка" поверх "Карты", но вы не хотите ее "проходить":

private void Label_MouseDown( object sender, MouseEventArgs)
{
   // Send this event down the line!
   Card_MouseDown(sender, e); // Call the card's MouseDown event function
}

Теперь вызывается соответствующая функция-событие, даже если щелкнуть надоедливую метку.

0 голосов
/ 31 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...