zoukankan      html  css  js  c++  java
  • 在 MouseDown 事件中区分单击和双击

    区分鼠标单击和双击事件

    处理 MouseDown 事件并确定单击位置和两次单击间的时间间隔,
    方法是使用适当的 SystemInformation 属性和 Timer 组件。
    根据发生的是单击还是双击,执行适当的操作。下面的代码示例阐释这是如何实现的。
    using System;
    using System.Drawing;
    using System.Windows.Forms;

    namespace SingleVersusDoubleClick
    {
    class Form1 : Form
    {
    private Rectangle hitTestRectangle = new Rectangle();
    private Rectangle doubleClickRectangle = new Rectangle();
    private TextBox textBox1 = new TextBox();
    private Timer doubleClickTimer = new Timer();
    private ProgressBar doubleClickBar = new ProgressBar();
    private Label label1 = new Label();
    private Label label2 = new Label();
    private bool isFirstClick = true;
    private bool isDoubleClick = false;
    private int milliseconds = 0;

    [STAThread]
    public static void Main()
    {
    Application.EnableVisualStyles();
    Application.Run(
    new Form1());
    }

    public Form1()
    {
    label1.Location
    = new Point(30, 5);
    label1.Size
    = new Size(100, 15);
    label1.Text
    = "Hit test rectangle:";

    label2.Location
    = new Point(30, 70);
    label2.Size
    = new Size(100, 15);
    label2.Text
    = "Double click timer:";

    hitTestRectangle.Location
    = new Point(30, 20);
    hitTestRectangle.Size
    = new Size(100, 40);

    doubleClickTimer.Interval
    = 100;
    doubleClickTimer.Tick
    +=
    new EventHandler(doubleClickTimer_Tick);

    doubleClickBar.Location
    = new Point(30, 85);
    doubleClickBar.Minimum
    = 0;
    doubleClickBar.Maximum
    = SystemInformation.DoubleClickTime;

    textBox1.Location
    = new Point(30, 120);
    textBox1.Size
    = new Size(200, 100);
    textBox1.AutoSize
    = false;
    textBox1.Multiline
    = true;

    this.Paint += new PaintEventHandler(Form1_Paint);
    this.MouseDown += new MouseEventHandler(Form1_MouseDown);
    this.Controls.AddRange(new Control[] { doubleClickBar, textBox1,
    label1, label2 });
    }

    // Detect a valid single click or double click.
    void Form1_MouseDown(object sender, MouseEventArgs e)
    {
    // Verify that the mouse click is in the main hit
    // test rectangle.
    if (!hitTestRectangle.Contains(e.Location))
    {
    return;
    }

    // This is the first mouse click.
    if (isFirstClick)
    {
    isFirstClick
    = false;

    // Determine the location and size of the double click
    // rectangle area to draw around the cursor point.
    doubleClickRectangle = new Rectangle(
    e.X
    - (SystemInformation.DoubleClickSize.Width / 2),
    e.Y
    - (SystemInformation.DoubleClickSize.Height / 2),
    SystemInformation.DoubleClickSize.Width,
    SystemInformation.DoubleClickSize.Height);
    Invalidate();

    // Start the double click timer.
    doubleClickTimer.Start();
    }

    // This is the second mouse click.
    else
    {
    // Verify that the mouse click is within the double click
    // rectangle and is within the system-defined double
    // click period.
    if (doubleClickRectangle.Contains(e.Location) &&
    milliseconds
    < SystemInformation.DoubleClickTime)
    {
    isDoubleClick
    = true;
    }
    }
    }

    void doubleClickTimer_Tick(object sender, EventArgs e)
    {
    milliseconds
    += 100;
    doubleClickBar.Increment(
    100);

    // The timer has reached the double click time limit.
    if (milliseconds >= SystemInformation.DoubleClickTime)
    {
    doubleClickTimer.Stop();

    if (isDoubleClick)
    {
    textBox1.AppendText(
    "Perform double click action");
    textBox1.AppendText(Environment.NewLine);
    }
    else
    {
    textBox1.AppendText(
    "Perform single click action");
    textBox1.AppendText(Environment.NewLine);
    }

    // Allow the MouseDown event handler to process clicks again.
    isFirstClick = true;
    isDoubleClick
    = false;
    milliseconds
    = 0;
    doubleClickBar.Value
    = 0;
    }
    }

    // Paint the hit test and double click rectangles.
    void Form1_Paint(object sender, PaintEventArgs e)
    {
    // Draw the border of the main hit test rectangle.
    e.Graphics.DrawRectangle(Pens.Black, hitTestRectangle);

    // Fill in the double click rectangle.
    e.Graphics.FillRectangle(Brushes.Blue, doubleClickRectangle);
    }
    }
    }
     
    代码源于MSDN


    返回导读目录,阅读更多随笔



    分割线,以下为博客签名:

    软件臭虫情未了
    • 编码一分钟
    • 测试十年功


    随笔如有错误或不恰当之处、为希望不误导他人,望大侠们给予批评指正。

  • 相关阅读:
    html5那些事儿
    Jquery插件开发方法
    Jquery用途
    常用的Jquery工具方法
    Jquery的方法(二)
    Jquery的方法(一)
    jQuery中bind,live,delegate,on的区别
    什么是大数据?
    Jquery选择器
    Caffe学习系列(12):不同格式下计算图片的均值和caffe.proto
  • 原文地址:https://www.cnblogs.com/08shiyan/p/2104066.html
Copyright © 2011-2022 走看看