Мышь движется слишком быстро, чтобы захватывать события - PullRequest
1 голос
/ 15 февраля 2010

это связано с: предыдущим вопросом

НО вопрос в том, что мой код дает сбой только тогда, когда я действительно очень быстро перемещаю мышь над панелью TableLayout.

Возможно ли, что C # или окна сообщают / запускают события не по порядку из-за быстрого движения мыши?

если так, как я могу это исправить?

спасибо. Я надеюсь, что это не считается двойной публикацией. если так, извиняюсь.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2010

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

2 голосов
/ 17 февраля 2010

я решил проблему. это был вопрос переупорядочения логического потока.

решение охватывает 3 события мыши MouseEnter, MouseMove, MouseLeave.

    private PictureBox HomeLastPicBox = null;

    private TableLayoutPanelCellPosition HomeLastPosition = new TableLayoutPanelCellPosition(0, 0);

    private void HomeTableLayoutPanel_MouseMove(object sender, MouseEventArgs e)
    {
        PictureBox HomeCurrentPicBox = (PictureBox)(HomeTableLayoutPanel.GetChildAtPoint(e.Location));

        if ((HomeCurrentPicBox != HomeLastPicBox) && (HomeCurrentPicBox != null))
        {

            HomeLastPicBox = (PictureBox)HomeTableLayoutPanel.GetControlFromPosition(HomeLastPosition.Column, HomeLastPosition.Row);

            if (GameModel.HomeCellStatus(HomeLastPosition.Column, HomeLastPosition.Row) == Cell.cellState.WATER)
            {
                HomeLastPicBox.Image = Properties.Resources.water;

            }

            TableLayoutPanelCellPosition HomeCurrentPosition = HomeTableLayoutPanel.GetCellPosition(HomeCurrentPicBox);

            if (GameModel.HomeCellStatus(HomeCurrentPosition.Column, HomeCurrentPosition.Row) == Cell.cellState.WATER)
            {
                HomeCurrentPicBox.Image = Properties.Resources.scan;

                HomeLastPosition = HomeCurrentPosition;
            }

            gameFormToolTip.SetToolTip(HomeTableLayoutPanel, GameModel.alphaCoords(HomeTableLayoutPanel.GetCellPosition(HomeCurrentPicBox).Column) + "," + HomeTableLayoutPanel.GetCellPosition(HomeCurrentPicBox).Row);
        }
    }

    private void HomeTableLayoutPanel_MouseEnter(object sender, EventArgs e)
    {
        Point p = HomeTableLayoutPanel.PointToClient(Control.MousePosition);
        PictureBox HomeCurrentPicBox = (PictureBox)(HomeTableLayoutPanel.GetChildAtPoint(p));

        if (HomeCurrentPicBox != null)
        {
            TableLayoutPanelCellPosition HomeCurrentPosition = HomeTableLayoutPanel.GetCellPosition(HomeCurrentPicBox);

            if (GameModel.HomeCellStatus(HomeCurrentPosition.Column, HomeCurrentPosition.Row) == Cell.cellState.WATER)
            {
                HomeCurrentPicBox.Image = Properties.Resources.scan;
            }

            gameFormToolTip.SetToolTip(HomeTableLayoutPanel, GameModel.alphaCoords(HomeTableLayoutPanel.GetCellPosition(HomeCurrentPicBox).Column) + "," + HomeTableLayoutPanel.GetCellPosition(HomeCurrentPicBox).Row);
        }
    }

    private void HomeTableLayoutPanel_MouseLeave(object sender, EventArgs e)
    {
        if (GameModel.HomeCellStatus(HomeLastPosition.Column, HomeLastPosition.Row) == Cell.cellState.WATER)
        {
            HomeLastPicBox = (PictureBox)HomeTableLayoutPanel.GetControlFromPosition(HomeLastPosition.Column, HomeLastPosition.Row);

            HomeLastPicBox.Image = Properties.Resources.water;

            gameFormToolTip.SetToolTip(HomeTableLayoutPanel, GameModel.alphaCoords(HomeTableLayoutPanel.GetCellPosition(HomeLastPicBox).Column) + "," + HomeTableLayoutPanel.GetCellPosition(HomeLastPicBox).Row);
        }
    }

Я думал, что выложу решение для будущих искателей знаний.

спасибо.

...