2013-09-06 5 views
1

버튼과 같은 동작으로 사용자 정의 컨트롤을 작성하고 있습니다. 사용자는 클릭 이벤트를 처리 할 수 ​​있어야하며 컨트롤은 클릭 이벤트를 시각적으로 표시해야합니다. OnMouseDown 메서드에서 컨트롤의 시각적 상태를 변경하고 OnMouseUp에서 컨트롤을 되돌려 놓으면 완벽하게 작동합니다. 그러나 테스트에서 내 컨트롤이 마우스 클릭 메시지를 항상받는 것은 아니지만 장치가 클릭에 대해 적절한 청각 신호를 생성하고 컨트롤이 포커스를 잃지 않는 것으로 나타났습니다.UserControl에서 클릭 메시지가 수신되지 않는 경우가 있음

P. 누구든지 좋은 유틸리티를 알고있는 경우 Windows 응용 프로그램에 Windows 메시지를 보낼 수 있도록 로그를 보내면 부풀어 오르고 어쩌면 무엇이 잘못 될지 알 수 있습니다. 여기

나는 내가 Compact Framework에서 내 버튼 컨트롤과 비슷한 문제가 있었다

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 스파이 도구처럼 작동합니다. – josef

답변

0

을 가지고있는 매우 단순화 된 버전을 가지고있는.

버튼을 빠르게 클릭하면 Click의 일부가 DoubleClick이됩니다.

이 코드는 나를 위해 문제를 해결 :

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

더 이상 작동하지 않습니다이 코드 DoubleClick를 삽입 한 후 그것을 조심하십시오.