Timer, click, mousedown, mouseup events not working together

百般思念 提交于 2019-12-23 17:13:50

问题


Looking for some help on a problem Im having

sorry if this question has already been asked, I can not find anything similar.

The idea is when a picturebox is clicked changed the image to ON.

If the picture box is held for more than 2 seconds to open a new form and leave the picturebox as OFF.

However if the picturebox is clicked ON and then held for 2 seconds and then returns i need the picturebox state to remain ON.

Here is what I have tried so far.

I believe for this to work correctly I need to stop MouseUp event from occuring.

Is there a way I can stop MouseUp when Tick occurs?

Is there a easier / better way to do this?

Any help would be appreciated.

    private void time_HoldDownInternal_Tick(object sender, EventArgs e)
    { 
        time_HoldDownInternal.Enabled = false;
        time_HoldDownInternal.Interval = 1000;
        form1show.Visible = true;
    }

    private void pb_pictureBoxTest_MouseDown(object sender, MouseEventArgs e)
    {
        mainMenuVariables.mousedown = true;
        time_HoldDownInternal.Enabled = true;
    }

    private void pb_pictureBoxTest_MouseUp(object sender, MouseEventArgs e)
    {
        mainMenuVariables.mousedown = false;
        //MessageBox.Show("mouse up");
        time_HoldDownInternal.Enabled = false;
        time_HoldDownInternal.Interval = 1000;
    }

    private void pb_pictureBoxTest_Click(object sender, EventArgs e)
    {
        if (mainMenuVariables.mousedown == true)
        {
            if (mainMenuVariables.pictureBox == false)
            {
                mainMenuVariables.pictureBox = true;
                pb_pictureBoxTest.Image = new Bitmap(mainMenuVariables.pictureBoxOn);
                return;
            }
            if (mainMenuVariables.pictureBox == true)
            {
                mainMenuVariables.pictureBox = false;
                pb_pictureBoxTest.Image = new Bitmap(mainMenuVariables.pictureBoxOff);
                return;
            }
        }
        if (mainMenuVariables.mousedown == false)
        {
            //nothing
        }
    }

回答1:


Rather than starting a timer, just record the current time on mouse down. Then in mouse up, check if it has been 2 seconds. e.g:

private void pb_pictureBoxTest_MouseDown(object sender, MouseEventArgs e)
{
    mainMenuVariables.mousedown = true;
    mainMenuVariables.mousedowntime = DateTime.Now;
}

private void pb_pictureBoxTest_MouseUp(object sender, MouseEventArgs e)
{
    mainMenuVariables.mousedown = false;
    var clickDuration = DateTime.Now - mainMenuVariables.mousedowntime;

    if ( clickDuration > TimeSpan.FromSeconds(2))
    {
        // Do 'hold' logic (e.g. open dialog, etc)
    }
    else
    {
        // Do normal click logic (e.g. toggle 'On'/'Off' image)
    }
}


来源:https://stackoverflow.com/questions/10406422/timer-click-mousedown-mouseup-events-not-working-together

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!