tags:

views:

282

answers:

2

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 it possible that C# or windows are reporting/triggering events out of order due to the fast mouse movement?

if so, how do i correct it?

thank you. i hope this is not considered double posting. if so, apologies.

+1  A: 

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.

alemjerus
this is excellent info. very useful to know. thanks.is there a check for this? ie. disable processing if the mouse is moving too fast?
iEisenhower
You can use mouse hooks. This might be useful: http://blogs.msdn.com/toub/archive/2006/05/03/589468.aspx
alemjerus
+1  A: 

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.

iEisenhower