Mouse moves too fast to capture events

后端 未结 2 1754
一生所求
一生所求 2021-01-23 10:25

this is related to: a previous question

BUT the question is my code only fails when i move the mouse really really fast over and around the TableLayoutPanel.

is

相关标签:
2条回答
  • 2021-01-23 10:48

    Mouse does not report its position by every pixel it passes, there are 20ms intervals between reports. If you manage to cross your control within this interval, it will catch no mouse events at all.

    0 讨论(0)
  • 2021-01-23 10:59

    i solved the issue. it was a matter of reordering the logic flow.

    the solution spans 3 mouse events 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);
            }
        }
    

    i thought i would post the solution for future knowledge seekers.

    thanks.

    0 讨论(0)
提交回复
热议问题