直接用窗体的click和doubleclick事件相应函数是没办法区分的,因为click在doubleclick前面被触发。
办法一:
在mousedown事件中处理,通过timer计算两次单击时间差。
private bool isFirstClick = true;
private bool isDoubleClick = false;
private int milliseconds = 0;
private Rectangle hitTestRectangle = new Rectangle();
private Rectangle doubleClickRectangle = new Rectangle();
// Detect a valid single click or double click.
private 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.
timer1.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;
}
}
}
timer相应函数:
private void timer1_Tick(object sender, EventArgs e) //计算间隔时间
{
milliseconds += 100;
// The timer has reached the double click time limit.
if (milliseconds >= SystemInformation.DoubleClickTime)
{
timer1.Stop();
if (isDoubleClick)
{
//textBox1.AppendText("Perform double click action");
//textBox1.AppendText(Environment.NewLine);
MessageBox.Show("double click action ", "message:", MessageBoxButtons.OK);
}
else
{
//textBox1.AppendText("Perform single click action");
//textBox1.AppendText(Environment.NewLine);
MessageBox.Show( "single click action ", "message:",MessageBoxButtons.OK);
}
// Allow the MouseDown event handler to process clicks again.
isFirstClick = true;
isDoubleClick = false;
milliseconds = 0;
}
}参考:http://msdn.microsoft.com/zh-cn/library/ms171543%28VS.80%29.aspx
当使用C#窗体的click和doubleclick事件时,由于click事件先于doubleclick触发,导致无法直接区分两者。解决方法是在mousedown事件中利用timer来计算两次点击的时间间隔,以此判断是单击还是双击。具体实现可参考MSDN相关文档。
623





