zoukankan      html  css  js  c++  java
  • C# 利用 Time 组件实现 Button 控件的长按功能

      参考链接:https://blog.csdn.net/yongh701/article/details/50134379

      如果在C#窗体,单纯点击按钮,之后将鼠标长时间放在这个按钮上,不放开,双击按钮默认产生的click事件是不会出现多次相应的。双击按钮默认产生的click事件只会在鼠标点击按钮,再松开按钮,这样才会执行其中的代码一次,无论你将点击之后,鼠标在按钮悬停多久,都不会相应的,会直到你松开未知。

      长按按钮效果如下图,长按 + 数字会一直增加,长按 — 数字会一直减少:

    实现步骤如下:

      1、要实现这样的功能,我们先拉两个按钮控件到窗体中(若项目建立后没有工具箱可以在视图里调出)

      

      

      2、拉4个定时器组件到窗体中,每个按钮到时候要用到两个定时器

      

       3、单击一下Button1按钮——>选择属性框里的事件——>选择鼠标事件——>选择按下跟放开的鼠标事件为Button1

      

      这里如果点击MouseDown跟MouseUp没有选项选择的话,可以先选择 “ 操作 ” 事件里的MouseClick为button1_MouseDown,这样在 “ 鼠标 ” 事件那里MouseDown就有button1选项选择了,不过要注意:在鼠标事件MouseDown里选择好button1后,要删除“ 操作 ” 事件里的MouseClick为button1_MouseDown,不然会每单次点击按钮的时候,按钮会执行两次点击操作。

      

      4、准备工作做好了,不要双击按钮,那样会生成Click事件,我们双击所有的定时器,产生定时器事件,然后回去属性窗口,双击鼠标事件里的,button1_MouseDown跟button1_MouseUp形成事件。

      5、接着在各个事件里添加代码,代码逻辑是:按下按钮后,检测到按下,就执行一次按下的代码,同时开启定时器1,定时2S;然后如果鼠标立即松开的话,就关闭定时器,只执行一次按下操作;如果鼠标没有松开,定时到2S后,开启定时器2,定时0.05S,并关闭定时器1,接着在鼠标按着的这段时间里每0.05S执行一次定时器2事件里的代码,直到鼠标松开时关闭定时器。

      先添加 button1_MouseDown 事件里的代码,里面添加按下一次时执行的代码跟开启定时器2,定时2S

           int but = 0;
            //button1部分
            private void button1_MouseDown(object sender, MouseEventArgs e)//一旦用户按下button1
            {
                but++; 
                Console.WriteLine(" but1 = " + but);//点击的时候执行一次该代码
                timer2.Interval = 2000;//timer2_Tick那段代码每2秒执行一次,初始执行,在2秒之后才正式开始
                timer2.Enabled = true;//开启timer2
            }

      接着添加定时器2事件里的代码,这里开启定时器1,定时0.05s,同时关闭自身,只要鼠标一直按下有2S后就执行这该代码

            private void timer2_Tick_1(object sender, EventArgs e)
            {
                timer1.Interval = 50;//timer1的代码每0.05s执行一次
                timer1.Enabled = true;//开始timer1
                //关闭time2,timer2_Tick这段代码就不要每2秒执行一次了,执行1次就好,这句话就完成timer2与timer1的线程同步
                timer2.Enabled = false;
            }

      然后添加定时器1事件的代码,这里添加开启定时器1后,每0.05S执行一次的代码,执行这里的代码后,只要鼠标没有放开,一直按下的话,就会每0.05S执行一次这里的代码,直到关闭定时器

            private void timer1_Tick_1(object sender, EventArgs e)
            {
                but++;
                Console.WriteLine(" but2 = " + but);//0.05S执行一次该代码
            }

      最后添加松开鼠标的事件代码,该代码主要是关闭定时器,这样子鼠标松开后,就不会执行定时器的内容了,就达到我松开鼠标时,就不执行那个按钮的逻辑的目的了

            private void button1_MouseUp(object sender, MouseEventArgs e)
            {
                //无论用户在2s内还是在2s之后就松开鼠标,就马上停止timer3,timer1的代码执行
                //如果用户在2s内松开鼠标,time1_Tick根本1次都不会执行
                timer2.Enabled = false;
                timer1.Enabled = false;
            }

      Button3按钮的实现逻辑跟Button1的一样,代码如下

            //button3
            int bu3 = 0;
            private void button3_MouseDown(object sender, MouseEventArgs e)
            {
                bu3++;
                Console.WriteLine(" bu3_1 = " + bu3);//点击的时候执行一次该代码
                timer3.Interval = 2000;//timer3_Tick那段代码每2秒执行一次,初始执行,在2秒之后才正式开始
                timer3.Enabled = true;//开启timer3
            }
    
            private void timer3_Tick(object sender, EventArgs e)
            {
                timer4.Interval = 50;//timer4的代码每0.05s执行一次
                timer4.Enabled = true;//开始timer4
                //关闭time3,timer3_Tick这段代码就不要每2秒执行一次了,执行1次就好,这句话就完成timer3与timer4的线程同步
                timer3.Enabled = false;
            }
    
            private void timer4_Tick(object sender, EventArgs e)
            {
                bu3++;
                Console.WriteLine(" but3_2 = " + bu3);//0.05S执行一次该代码
            }
    
            private void button3_MouseUp(object sender, MouseEventArgs e)
            {
                //无论用户在2s内还是在2s之后就松开鼠标,就马上停止timer3,timer4的代码执行
                //如果用户在2s内松开鼠标,time3_Tick根本1次都不会执行
                timer3.Enabled = false;
                timer4.Enabled = false;
            }

    通过上面步骤就可以实现按钮长按功能了,打印信息效果如下:

      单击一次按钮的效果

      

      长按按钮1再松开的效果

      

      长按按钮3再松开的效果

      

      

  • 相关阅读:
    在ashx页面中获取session
    写给程序猿们的交互设计
    javascript如何合并多个数组
    <%%>
    #实用# 在应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的原因
    通过ContentType = "text/XML" 实现ASP输出xml
    [记录] Host Office Document In WebBrowser control in a Windows Form Application.
    [转载]error LNK2001: unresolved external symbol __DllMainCRTStartup@12错误
    Access database not open
    一些Access MVP们的博客
  • 原文地址:https://www.cnblogs.com/xingboy/p/10837236.html
Copyright © 2011-2022 走看看