如何使鼠标按下后2秒,鼠标样式由default变成hand,在执行mousedown里面的程序

halsl 2014-11-06 01:56:51
[private void panel1_MouseDown(object sender, MouseEventArgs e)
{
//System.Threading.Thread.Sleep(3000);

this.panel1.Cursor = System.Windows.Forms.Cursors.Hand; //怎么把这句话变成延时2秒后再执行。

if(e.Button==MouseButtons.Left)
{
。。。。。。
}
}

因为我想判断mouse如果执行速度小于2秒内就执行click事件,如果鼠标按在屏幕上超过2秒鼠标样式变成手型 。就执行mousedown和mouseup事件。
...全文
272 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
halsl 2014-11-13
  • 打赏
  • 举报
回复
谢谢各位了。
halsl 2014-11-13
  • 打赏
  • 举报
回复
这个我也解决了,原来事件没有去除。加了一句 t.Elapsed -= new System.Timers.ElapsedEventHandler(TimeReach); 就好了。
halsl 2014-11-13
  • 打赏
  • 举报
回复
bool isTimer1Act; //timer1时间到就act,也就是说鼠标变成了手型。 private void panel1_MouseDown(object sender, MouseEventArgs e) { if(e.Button==MouseButtons.Left) { t.AutoReset = false;//设置是执行一次(false)还是一直执行(true); t.Enabled = true; t.Elapsed += new System.Timers.ElapsedEventHandler(TimeReach);//到达时间的时候执行事件; t.Start(); } public void TimeReach(object source, System.Timers.ElapsedEventArgs e)//时间到就调用这个程序 { t.Enabled = false;//如果时间到就关闭时间Timer t t.Stop(); this.button4.Invoke(new Action(() => { this.button4.Text = j++.ToString(); })); this.panel1.Invoke(new Action(() => //new Action(代理的对象名) { this.panel1.Cursor = System.Windows.Forms.Cursors.Hand; }));  isTimer1Act = true; } private void panel1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left ) { this.panel1.Invoke(new Action(() => { this.panel1.Cursor = System.Windows.Forms.Cursors.Default; })); t.Enabled = false;//如果时间到就关闭时间Timer t t.Stop(); isTimer1Act = false; button1.Text = isDnInPnl1.ToString(); } } int f = 0; //MouseClick执行与MouseUp之前 private void panel1_MouseClick(object sender, MouseEventArgs e) { if (isTimer1Act == false) { button3.Text = (f++).ToString(); } } 程序是搞定了,但this.button4.Invoke(new Action(() => { this.button4.Text = j++.ToString(); })); 这句话每次都执行好几遍,为什么
hwangt0 2014-11-12
  • 打赏
  • 举报
回复
Timer中操作控件,请使用invoke
halsl 2014-11-12
  • 打赏
  • 举报
回复
public partial class Form1 : Form { System.Timers.Timer t = new System.Timers.Timer(2000);//2秒触发手型鼠标 private void panel1_MouseDown(object sender, MouseEventArgs e) { if(e.Button==MouseButtons.Left) { t.AutoReset = false;//设置是执行一次(false)还是一直执行(true); t.Enabled = true; t.Elapsed += new System.Timers.ElapsedEventHandler(TimeReach);//到达时间的时候执行事件; } public void TimeReach(object source, System.Timers.ElapsedEventArgs e)//时间到就调用这个程序 { this.panel1.Cursor = System.Windows.Forms.Cursors.Hand; } } 为什么我执行这个程序是会出现 “线程间操作无效: 从不是创建控件“panel1”的线程访问它。”,该怎么解决?
Mr_Zcy 2014-11-12
  • 打赏
  • 举报
回复
如果按下就要变成HAND的话,那就用个时间器吧,按下时候调用时间器,隔到两秒的时候再判断前面说的记录时间间隔.
Mr_Zcy 2014-11-12
  • 打赏
  • 举报
回复
如果换个思路看你看,你按下的时候记录下时间,弹起的时候做个时间差看下是否有2秒,因为弹起的时候都会调用点击事件,那时候自己判断下
  • 打赏
  • 举报
回复
同时监控MouseDown和MouseUp事件 当MouseDown时,触发一个timer,这个timer会在2秒钟后将改变鼠标形状并且清除timer 当MouseUp时,如果timer还在,则清除timer,另外不管timer是否存在,都应该恢复鼠标形状
zzyhost 2014-11-06
  • 打赏
  • 举报
回复
按下后开始计时,过2秒时判断鼠标是否抬起
兔子-顾问 2014-11-06
  • 打赏
  • 举报
回复
new Action(() =>
               {
                   System.Threading.Thread.Sleep(2000);
                   this.Invoke((Action)delegate { this.panel1.Cursor = System.Windows.Forms.Cursors.Hand; });
               }).BeginInvoke(null, null);
halsl 2014-11-06
  • 打赏
  • 举报
回复
5楼的程序能在vs2010中运行吗?
phommy 2014-11-06
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
不管你是用timer也好,线程也罢 好歹你必须得能够获取到鼠标当前状态,是按下还是抬起 而不是只有在按下和抬起的瞬间才知道 如果你确保鼠标不会跑到panel的外面去,自己做变量,按下时变成true,抬起时变成false,也可以在timer里去判断这个bool 但是如果鼠标跑到panel外面去了,鼠标即使抬起了,也不会触发事件 这样你的程序就会认为鼠标一直按下没有抬起
鼠标移走就得不到mouseup事件了,这是个问题。如果想解决,在要mousedown里写上panel1.Capture=true; ,在合适的时机(比如mouseup)释放掉
terender 2014-11-06
  • 打赏
  • 举报
回复
其实我理解楼主的意思了,虽然他自己都不理解 楼主的需求应该是 当鼠标按下,则开始计时; 当鼠标弹起时,计时结束; 同时判断鼠标一共被按下了多久,小于2秒则foo(), 大于2秒则bar() 楼主不是代码不会写,而是逻辑关系没有搞清楚。不是在鼠标按下事件里计时,而是按下开始计时,弹起则结束。 按下与弹起都是一个瞬间发生的事件,这个怎么计时........ 只有两个事件中间间隔了多长时间这个才能计时
於黾 2014-11-06
  • 打赏
  • 举报
回复
不管你是用timer也好,线程也罢 好歹你必须得能够获取到鼠标当前状态,是按下还是抬起 而不是只有在按下和抬起的瞬间才知道 如果你确保鼠标不会跑到panel的外面去,自己做变量,按下时变成true,抬起时变成false,也可以在timer里去判断这个bool 但是如果鼠标跑到panel外面去了,鼠标即使抬起了,也不会触发事件 这样你的程序就会认为鼠标一直按下没有抬起
於黾 2014-11-06
  • 打赏
  • 举报
回复
在方法mousedown( )中判断时间t 这个思路有问题, 这是个事件的回调函数,只有鼠标按下的时候才会执行,你在这里判断,t永远都<2的
halsl 2014-11-06
  • 打赏
  • 举报
回复
谢谢各位的回答,其实我的意思很简单 0.预先定义一个全局bool变量t,用来判断时间是不是2秒。<2秒 t=false.; >2秒t=true; 1. 在鼠标左键按下去后,mousedown()是肯定执行的,在方法mousedown( )中判断时间t,如不到2秒鼠标就up了,方法mousedown( )里面的程序就不执行了t=false。到2秒执行mousedown( )里面的程序t=true。 2.当鼠标抬起后,肯定执行方法MouseClick()。根据 t 决定MouseClick()的程序执行与否。 不知道各位能懂我的意思吗。
phommy 2014-11-06
  • 打赏
  • 举报
回复
完整代码,帖上就能用,除了三个事件你自己通过窗体设计器挂

using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1() { InitializeComponent(); }

        async void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            var mouseUp = false;
            MouseEventHandler s = (sender1, e1) => { mouseUp = true; };
            panel1.MouseUp += s;
            await Task.Delay(2000);
            panel1.MouseUp -= s;

            if (mouseUp)
            {
                return;
            }

            Cursor = Cursors.Hand;
            if (e.Button == MouseButtons.Left)
            {
                MessageBox.Show("mouse down");
            }
        }

        void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            if (Cursor == Cursors.Hand)
            {
                return;
            }
            MessageBox.Show("mouse click");
        }

        void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            if (Cursor != Cursors.Hand)
            {
                return;
            }
            MessageBox.Show("mouse up");
            Cursor = Cursors.Arrow;
        }
    }
}
layershow 2014-11-06
  • 打赏
  • 举报
回复
呃,你这说法有问题,当左键按下去的时候,你知道我要按 1秒还是 3秒吗?那么 Click 要不要做? 所以你的判断应该是左键的 UP? MouseClick 的触发不由你决定,所以单独写一个函数,不要挂接 Click 事件
於黾 2014-11-06
  • 打赏
  • 举报
回复
那就不要用事件 而是调用鼠标的API,通过轮询的方式检测鼠标是否被按下
halsl 2014-11-06
  • 打赏
  • 举报
回复
谢谢2楼的回答,也许是我表达不清楚,下面我好好说一下 如果我鼠标左键按下去<2秒,就启动panel1_MouseClick( )里面的程序。 如果 >2秒,鼠标就变成手型,启动panel1_MouseDown( )里面的程序。 private void panel1_MouseDown(object sender, MouseEventArgs e) { this.panel1.Cursor = System.Windows.Forms.Cursors.Hand; if(e.Button==MouseButtons.Left) { 。。。。。。 } } private void panel1_MouseUp(object sender, MouseEventArgs e) { 。。。。。。。。 } private void panel1_MouseClick(object sender, MouseEventArgs e) { 。。。。。 }
加载更多回复(1)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧