如何:区分单击和双击

 我来答
好程序员
2016-12-09 · HTML5前端培训/大数据培训/Java
好程序员
好程序员是IT高端课程培训基地,从平凡到卓越,为梦想而拼搏。
向TA提问
展开全部
例如,单击通常选择一个项,而双击编辑所选的项。然而,Windows 窗体单击事件并不能轻松适用于下面这种特定方案,即单击和双击执行的操作不兼容的方案,这是因为连接到 Click 或MouseClick 事件的操作是在连接到 DoubleClick 或MouseDoubleClick 事件的操作之前执行的。此主题阐释此问题的两种解决办法。一种方法是处理双击事件,然后回滚处理单击事件中执行操作。在极少数情况下,您可能需要通过处理 MouseDown 事件,并通过使用 SystemInformation 类的DoubleClickTime 和DoubleClickSize 属性来模拟单击和双击行为。您可以测量两次单击间的时间,如果第二次单击与第一次单击的间隔时间小于 DoubleClickTime 的值,且该单击在 DoubleClickSize 定义的矩形内发生,则执行双击操作;否则,执行单击操作。回滚单击操作确保您正在处理的控件具有标准的双击行为。如果不具有标准双击行为,请用 SetStyle 方法启用控件。然后处理双击事件,并回滚单击操作及双击操作。下面的代码示例阐释如何创建启用双击行为的自定义按钮,及如何在双击事件处理代码中回滚单击操作。C#VBusing System; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MouseRollBackSingleClick { publicclass Form1 : Form { private DoubleClickButton button1; private FormBorderStyle initialStyle; public Form1() { initialStyle = this.FormBorderStyle; this.ClientSize = new System.Drawing.Size(292, 266); button1 = new DoubleClickButton(); button1.Location = new Point (40,40); button1.Click += new EventHandler(button1_Click); button1.AutoSize = true; this.AllowDrop = true; button1.Text = "Click or Double Click"; button1.DoubleClick += new EventHandler(button1_DoubleClick); this.Controls.Add(button1); } // Handle the double click event.void button1_DoubleClick(object sender, EventArgs e) { // Change the border style back to the initial style.this.FormBorderStyle = initialStyle; MessageBox.Show("Rolled back single click change."); } // Handle the click event.void button1_Click(object sender, EventArgs e) { this.FormBorderStyle = FormBorderStyle.FixedToolWindow; } [STAThread] staticvoid Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } } publicclass DoubleClickButton : Button { public DoubleClickButton() : base() { // Set the style so a double click event occurs. SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true); } } } 在MouseDown 事件中区分单击和双击处理MouseDown 事件并确定单击位置和两次单击间的时间间隔,方法是使用适当的 SystemInformation 属性和 Timer 组件。根据发生的是单击还是双击,执行适当的操作。下面的代码示例阐释这是如何实现的。C#C++VBusing 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(); privatebool isFirstClick = true; privatebool isDoubleClick = false; privateint milliseconds = 0; [STAThread] publicstaticvoid 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); } } } 请参见其他资源Windows 窗体应用程序中的鼠标输入
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式