急问:如何同时捕捉鼠标按下和双击事件?
peniy 2004-09-10 11:03:21 我要在鼠标按下(非双击)时移动一个label。双击时在两个label间加一条直线。
因为按下鼠标后没有人知道将会不会双击只能先设置一个isFirst=true,起一个Timer设为SystemInformation.DoubleClickTime时间后检查这个变量值。代码如下:
private void labelLarge_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{ if( e.Button == MouseButtons.Left && e.Clicks == 1)
{
isFirst = true;
System.Threading.TimerCallback timerDelegate =
new System.Threading.TimerCallback(doLabelLargeMouseDown);
object state = new object[] {sender,e};
tmr = new System.Threading.Timer(timerDelegate,state,
SystemInformation.DoubleClickTime, 0);
}
else if(e.Button == MouseButtons.Left && e.Clicks == 2)
{
isFirst = false;
}
base.OnMouseDown(e);
}
private void doLabelLargeMouseDown(Object state)
{
object[] obj = (object[])state;
MouseEventArgs e = (MouseEventArgs)obj[1];
Object sender = obj[0];
if(isFirst)
{
isFirst = false;
Label organLabel = (Label)sender;
Point offset = new Point(e.X,e.Y);
action = new MoveOrgan(organLabel,offset);
CanvasPanel.Cursor = new Cursor(GetType(), "DRAGMOVE.CUR");
this.startDrag = true;
Console.WriteLine("capture={0}",CanvasPanel.Capture.ToString());
CanvasPanel.Capture = true;//这里不行。
Console.WriteLine("capture={0}",CanvasPanel.Capture.ToString());
isDbClicked = false;
}
else
{
isFirst = false;
if( action is WorkFlowLine)
{
Console.WriteLine("second");
isDbClicked = false;
action.DoAction(this,sender,null);
}
else
{
Console.WriteLine("first");
isDbClicked = true;
Label startLabel = (Label)sender;
action = new WorkFlowLine(startLabel,true);
}
}
}
代码本身可以达到区分按下,与双击的事件。但是,CanvasPanel.Capture = true。前后却总是false.没办法变为true.这是因为线程的原因吗? 怎么处理。