2013-09-06 2 views
1

Я пишу пользовательский элемент управления с поведением типа кнопки. Пользователь должен иметь возможность обрабатывать событие клика, а элемент управления должен визуально сигнализировать о его нажатии. Я изменяю визуальное состояние элемента управления в методе OnMouseDown и возвращаю его обратно в OnMouseUp, и это отлично работает; однако я заметил, что при проверке мой элемент управления не всегда будет получать сообщения мыши, но устройство делает правильные звуковые сигналы для щелчка, а элемент управления не теряет фокус.UserControl иногда не получает сообщений о клике

P.S. Если кто-нибудь знает о хорошей утилите, которая позволит мне регистрировать сообщения Windows, отправленные в мое приложение, которые будут раздуваться и, возможно, помогут мне понять, что может быть неправильным.

Вот что у меня есть очень упрощенный вариант того, что у меня есть

public class CustomButton : UserControl 
{ 
    private bool _isMouseDown = false;//flag tells PaintBorder what state to draw 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     PaintBackground(e); 
     PaintBorder(e, _isMouseDown); 
    } 

    protected override void OnGotFocus(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnGotFocus(e); 
    } 

    protected override void OnTextChanged(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnTextChanged(e); 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      _isMouseDown = true; 

      if (!this.Focused) 
      { 
       this.Focus(); 
      } 
      else //getting focus causes Invalidate, no need to call twice 
      { 
       this.Invalidate(); 
      } 
     } 
     base.OnMouseDown(e); 
    } 

    protected override void OnClick(EventArgs e) 
    { 
     base.OnClick(e); 
    } 

    protected override void OnMouseUp(MouseEventArgs e) 
    { 
     if (_isMouseDown) 
     { 
      _isMouseDown = false; 
      this.Invalidate(); 
     } 
     base.OnMouseUp(e); 
    } 
} 
+1

Опубликуйте некоторый код, чтобы показать, как вы создаете кнопки, а также обрабатываете их действия. Без этого мы можем только догадываться, что происходит на самом деле. –

+0

@NicholasPost: Код встал! – jp2code

+0

Чтобы просмотреть сообщения в окне, вы можете использовать RemoteSpy (часть удаленных инструментов, поставляемых с WM SDK): http://msdn.microsoft.com/en-us/library/ms894593.aspx. Он работает как локальный инструмент VS Spy. – josef

ответ

0

У меня была аналогичная проблема с моей кнопки управления для Compact Framework.

Получается, что если вы нажмете кнопку достаточно быстро, некоторые из Click s станут DoubleClick s.

Этот код фиксируется вопрос для меня:

protected override void OnDoubleClick(EventArgs e) 
{ 
    base.OnClick(e); 
} 

Учтите, что после вставки этого кода DoubleClick больше не будет работать.

Смежные вопросы