参考链接: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 = ;
//button1部分
private void button1_MouseDown(object sender, MouseEventArgs e)//一旦用户按下button1
{
but++;
Console.WriteLine(" but1 = " + but);//点击的时候执行一次该代码
timer2.Interval = ;//timer2_Tick那段代码每2秒执行一次,初始执行,在2秒之后才正式开始
timer2.Enabled = true;//开启timer2
}

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

        private void timer2_Tick_1(object sender, EventArgs e)
{
timer1.Interval = ;//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 = ;
private void button3_MouseDown(object sender, MouseEventArgs e)
{
bu3++;
Console.WriteLine(" bu3_1 = " + bu3);//点击的时候执行一次该代码
timer3.Interval = ;//timer3_Tick那段代码每2秒执行一次,初始执行,在2秒之后才正式开始
timer3.Enabled = true;//开启timer3
} private void timer3_Tick(object sender, EventArgs e)
{
timer4.Interval = ;//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再松开的效果

  

  

C# 利用 Time 组件实现 Button 控件的长按功能的更多相关文章

  1. Android中如何利用attrs和styles定义控件

    一直有个问题就是,Android中是如何通过布局文件,就能实现控件效果的不同呢?比如在布局文件中,我设置了一个TextView,给它设置了 textColor,它就能够改变这个TextView的文本的 ...

  2. UGUI Button控件

    今天一起来学习下Button控件, Button控件其实是由Text,Button,Image组件形成的. 这里就简单介绍下Button组件 Interactable: 代表该组件是否进行交互, 我们 ...

  3. ASP.NET Button控件的UseSubmitBehavior属性引发的血案

    这里先不说标题上的UseSubmitBehavior属性是什么,先说下面这种情况. 通常,在我们写一个表单页面的时候,最下方会有“提交”和“返回”字样的两个按钮.顾名思义,它们的功能大家都知道,但是一 ...

  4. winform快速开发平台 -> 基础组件之分页控件

    一个项目控件主要由及部分的常用组件,当然本次介绍的是通用分页控件. 处理思想:我们在处理分页过程中主要是针对数据库操作. 一般情况主要是传递一些开始位置,当前页数,和数据总页数以及相关关联的业务逻辑. ...

  5. [原创]在Framelayout中放置button控件出现的覆盖问题

    android Framelayout(帧布局)是很常用的布局,主要用来处理需要多个view叠加显示的情况. 然而在使用中,我发现Framelayout中的Button控件,会挡住所有其他控件,而不论 ...

  6. asp.net动态生成按钮Button控件

    1.动态生成button控件及响应服务端和客户端事件 void BindButtons(){ foreach (var item in items) { Button Btn = new Button ...

  7. WPF--Blend制作Button控件模板--问题补充

    补充记录Button控件模板 控件模板制作过程中出现下图问题:动画对象不能用于动画属性"Fill” 并且这类问题Blend4中包括VS2010中仍然可以运行,但是只有VS2010中会报错:如 ...

  8. WPF--Blend制作Button控件模板

    博客园新人,WPF初学者.不涉及理论知识,直接进入操作. 记录一下使用Blend制作Button控件模板过程中,学到Blend几个知识点: 1.渐变画笔编辑器的Alpha选项可以调控件的透明度.即下图 ...

  9. C# Windows - Button 控件

    .Net Framework提供了一个派生于Control的类System.Windows.Forms.ButtonBase,它实现了Button控件所需的基本功能. System.Windows.F ...

随机推荐

  1. hdu3371 Connect the Cities (MST)

    Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. Hadoop Web项目--Mahout0.10 MR算法集锦

    1. 涉及技术及下载 项目开发使用到的软件有:Myeclipse2014,JDK1.8.Hadoop2.6,MySQL5.6.EasyUI1.3.6,jQuery2.0,Spring4.1.3,Hib ...

  3. luogu1081 开车旅行 树上倍增

    题目大意 小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市i 的海拔高度为Hi,城市i 和城市j 之间的距离 ...

  4. B1295 [SCOI2009]最长距离 最短路

    就是一道最短路的裸题,直接跑spfa就行了.(spfa死了) 最后在答案处判断是否障碍物太多,然后就直接找最大值就行. (数据特别水,我错误算法60) 题干: Description windy有一块 ...

  5. B1218 [HNOI2003]激光炸弹 dp

    这个题其实打眼一看就知道差不多是dp,而且基本确定是前缀和.然后硬钢就行了...直接暴力预处理前缀和,然后直接dp就行. 题干: Description 一种新型的激光炸弹,可以摧毁一个边长为R的正方 ...

  6. Drainage Ditches(网络流(EK算法))

    计算最大流,EK算法模板题. #include <stdio.h> #include <string.h> #include <queue> using names ...

  7. codevs1222 信与信封问题

    1222 信与信封问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description John先生晚上写了n封信,并相应地写了 ...

  8. codevs2594解药还是毒药(状压dp)

    2594 解药还是毒药  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description Smart研制出对付各种症状的解药,可是 ...

  9. JavaScript学习二

    2019-05-30 15:08:24 加油,这几天在赶高数,都…… <!DOCTYPE html> <html> <head> <script type=& ...

  10. APP加固反调试(Anti-debugging)技术点汇总

    0x00 时间相关反调试 通过计算某部分代码的执行时间差来判断是否被调试,在Linux内核下可以通过time.gettimeofday,或者直接通过sys call来获取当前时间.另外,还可以通过自定 ...