2012-02-22 4 views
3

The documentation for the MouseDoubleClick event состоянияКогда событие DoubleClick поднято, отличное от двойного щелчка мыши?

Важные

события DoubleClick логически события более высокого уровня управления. Они могут быть подняты другими действиями пользователя, такими как комбинации комбинаций клавиш.

Однако мне не удалось найти элемент управления, который поднимает DoubleClick события в ситуациях, в которых MouseDoubleClick не также поднят, и the documentation for DoubleClick event ничего не упоминает ни. Когда это используется?

+0

Нажмите, тем более очевидным, вы можете нажать кнопку, нажав пробел. * Разрешено * для управления вызывать OnDoubleClick на любом входном событии, не обязательно означает, что имеет смысл это сделать. –

+0

@HansPassant Я знаю, нажатие Enter дано в качестве примера в документации 'MouseClick'. Я могу представить себе некоторые ситуации, когда «OnDoubleClick» имеет смысл, один из которых нажимает Enter в «ListView». Однако в тех, которые я могу придумать, это на самом деле не происходит. – hvd

+0

Стандартные элементы управления .NET этого не делают. Не могу говорить за десятки тысяч других. –

ответ

0

В некоторых случаях вам нужны свойства мыши (местоположение, клики ..), поэтому вы используете событие mousedoubleclicks, в других случаях они вам не понадобятся, поэтому система может сэкономить несколько байтов и повысить производительность.

Например, ниже приложения почти чистый GDI, так что, когда я нажимаю какое-то место, это настолько важно, что у меня есть свойства мыши ...

enter image description here

Update

Вы правы in:

: Нет случая, когда двойной клик поднят, ERSA, потому что я декомпилировал класс управления в .NET 3.5, и нашел единственное место, что буксировать события возникают в том же месте OnMouseUp с некоторыми условиями:

private void WmMouseUp(ref Message m, MouseButtons button, int clicks) 
{ 
    try 
    { 
     int x = NativeMethods.Util.SignedLOWORD(m.LParam); 
     int y = NativeMethods.Util.SignedHIWORD(m.LParam); 
     Point p = new Point(x, y); 
     p = this.PointToScreen(p); 
     if (!this.GetStyle(ControlStyles.UserMouse)) 
     { 
      this.DefWndProc(ref m); 
     } 
     else if (button == MouseButtons.Right) 
     { 
      this.SendMessage(0x7b, this.Handle, NativeMethods.Util.MAKELPARAM(p.X, p.Y)); 
     } 
     bool flag = false; 
     if ((((this.controlStyle & ControlStyles.StandardClick) == ControlStyles.StandardClick) && this.GetState(0x8000000)) && (!this.IsDisposed && (UnsafeNativeMethods.WindowFromPoint(p.X, p.Y) == this.Handle))) 
     { 
      flag = true; 
     } 
     if (flag && !this.ValidationCancelled) 
     { 
      if (!this.GetState(0x4000000)) 
      { 
       this.OnClick(new MouseEventArgs(button, clicks, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0)); 
       this.OnMouseClick(new MouseEventArgs(button, clicks, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0)); 
      } 
      else 
      { 
       this.OnDoubleClick(new MouseEventArgs(button, 2, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0)); 
       this.OnMouseDoubleClick(new MouseEventArgs(button, 2, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0)); 
      } 
     } 
     this.OnMouseUp(new MouseEventArgs(button, clicks, NativeMethods.Util.SignedLOWORD(m.LParam), NativeMethods.Util.SignedHIWORD(m.LParam), 0)); 
    } 
    finally 
    { 
     this.SetState(0x4000000, false); 
     this.SetState(0x8000000, false); 
     this.SetState(0x10000000, false); 
     this.CaptureInternal = false; 
    } 
} 

: вызов обработчика не вызываются если никакой обработчик не существует:

[EditorBrowsable(EditorBrowsableState.Advanced)] 
protected virtual void OnMouseDoubleClick(MouseEventArgs e) 
{ 
    MouseEventHandler handler = (MouseEventHandler) base.Events[EventMouseDoubleClick]; 
    if (handler != null) 
    { 
     handler(this, e); 
    } 
} 
+0

Я не прошу, когда использовать какое событие. Кроме того, класс 'MouseEventArgs' создается, даже если для соответствующего события не регистрируются обработчики событий, поэтому использование одного или другого сохраняет в памяти точно нулевые байты. – hvd

+0

'MouseEventArgs' уже создан экземпляром к тому времени, когда вызывается' OnMouseDoubleClick'. Кроме того, 'OnDoubleClick' и' OnMouseDoubleClick' * * вызываются из других мест, однако, насколько я могу судить, они всегда вызываются. – hvd

+0

Да, вы правы, но это означало, что обработчик не называется ... извините, мой плохой :) –