2010-12-28 6 views
2

안녕하세요, 저는 거기에 클래스를 제공하는 방법을 theres 클릭 이벤트가 있는지 궁금 해서요. 예를 들어, 나는 카드 클래스를 가지고 있으며, 사용자가 그 클래스의 (카드의 그림을 표시하는) 사각형을 클릭 할 때를 알 수있는 방법이 있습니까?클래스 클릭 이벤트 C#

이상, 카드 사각형을 클릭하면 어떻게 알 수 있습니까?

+0

Panel 또는 Control과 같은 적절한 "기본"UI 클래스를 캡슐화하거나 확장하려는 경우가 있습니다. WinForms 또는 ASP.NET 또는 WPF를 의미하는 경우에 따라 달라집니다. 그런 다음 클릭 이벤트, 처리 (예 : 마우스가 영역 X 위에있을 때 클릭 만 등록)를 수행 한 다음 클라이언트가 연결할 수있는 자체 이벤트를 게시하십시오. [이벤트 자습서 (C#) - WinForms] (http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx)를 시작해야합니다. 행복한 코딩. –

+2

WPF 또는 WinForms ... 아니면 다른 것? –

답변

7

Windows에서 "마우스를 여기"클릭 한 메시지를 얻으려면 창 핸들이 있어야합니다. WinForms에서 Windows.Forms.Control에서 파생 된 모든 항목에는 창 핸들이 있으며 마우스 메시지가 표시됩니다. 이러한 메시지는 .NET MouseDown, MouseUp, MouseClick 등의 이벤트로 자동 변환됩니다.

아마도 카드가 컨트롤이되어야합니다. 그렇지 않은 경우 (예 : 많은 카드 관리 및 드로잉을 담당하는 "손"컨트롤이있는 경우) 해당 컨트롤은 마우스 이벤트 (예 : MouseClick)를 가져와 실제로 클릭 한 카드를 파악해야합니다 컨텍스트 및 마우스 이벤트의 좌표

+0

thx man! 이제 나는 컨트롤을 만드는 법을 배우러 간다. . . – Bigfatty

1

클래스에 이벤트를 쉽게 추가 할 수 있지만 클래스를 클릭 할 때 클래스가 알 수있는 유일한 방법은 해당 이벤트가 있거나 구성 요소가있는 경우입니다.

그게 바로 컨트롤입니다. 이러한 이벤트를 감지 할 수있는 클래스를 작성해야하는 경우 컨트롤을 만드는 것이 좋습니다.

3

실제로 문제의 두 부분이 있습니다. 첫 번째는 이벤트를 만들고 두 번째는 뭔가에 연결하는 것입니다. 이벤트를 만들기

은 쉬운 부분이다 : 당신이 그 이벤트에 대한 가입자를 설정할 수 있습니다 다른 곳에서 그런

public class Card { 
    public event EventHandler<MouseEventArgs> Click; 
    protected void OnClick(MouseEventArgs e) { 
     EventHandler<MouseEventArgs> handler = Click; 
     if(handler != null) { 
      handler(this, e); 
     } 
    } 

    internal void CheckIfClicked(MouseEventArgs e) { 
     if(/* this mouse event intersects this Card */) { 
      OnClick(e); 
     } 
    } 
} 

평소와 같은 :

public class CardWatcher { 
    private Card card; 

    public CardWatcher(Card card) { 
     this.card = card; 
     this.card.Click += card_Clicked; 
    } 

    private void card_Clicked(object sender, MouseEventArgs e) { 
     // Our Card has been clicked; do something about it 
    } 
} 

(우리는 이벤트 처리기를 부착하고 있습니다 수동으로 만들었지 만 GUI를 사용하여 컨트롤에 이벤트 처리기를 연결하면 Visual Studio 디자이너가 생성하는 것과 거의 동일한 코드입니다.)

그리고 나서 n 그 클릭 이벤트를 캡처 어딘가에 EED (사실,이 문제의 핵심처럼 보인다) :

  1. 는 서브 클래스를 작성 : 이벤트에 응답하는 방법은 두 가지가 일반적으로있다

    public partial class CardContainer : UserControl { 
        private List<Card> cards = new List<Card>(); 
    
        public CardContainer() { 
         InitializeComponent(); 
    
         // Initialize cards here... 
        } 
    
        protected override void OnMouseUp(MouseEventArgs e) { 
         foreach(Card card in cards) { 
          card.CheckIfClicked(e); 
         } 
         base.OnMouseUp(e); 
        } 
    } 
    

    공지 것을 및

  2. 는 다른 답변으로

는 지적 이벤트 처리기 대리자를 부착합니다 OnEvent 방법의 동작을 재정의, 윈도우는 운영 시스템은 윈도우 인 객체 (즉, 윈도우 핸들이있는 객체)에 이벤트를 전달합니다. .NET 내에서 이것은 Control의 서브 클래스 인 오브젝트를 의미합니다.

Control을 직접 하위 클래스로 만들거나 UserControl과 같은 클래스를 서브 클래 싱하여 디자인보기에서 만드는 다른 컨트롤의 컨테이너가 될 수있는 컨트롤을 만들 수 있습니다 (같은 방식으로) 당신은 양식을 만든다.)

그래서, 당신의 선택은 다음과 같습니다 :

  • Card 컨트롤 자체를 확인; 양식에 배치하고 클릭 이벤트 (및 기타 이벤트)를 직접 수신 할 수 있습니다. 단점은 각 요소가 Windows에서 창 핸들을 할당하기 때문에 한 번에 많은 요소가 활성화되어 있으면 많은 리소스를 사용할 수 있다는 것입니다.
  • 컨트롤 인 Card에 대한 컨테이너를 만듭니다. 이 컨테이너 컨트롤은 양식에 배치하고 클릭 이벤트 (및 기타 이벤트)를 직접받을 수 있습니다. 단점은 이러한 클릭 이벤트를 개별 카드에 위임하는 방법을 수동으로 파악해야한다는 것입니다. 실제 Click 이벤트에는 좌표가 포함되어 있지 않으므로 대신 MouseUp 이벤트를 처리해야합니다.
  • 다른 컨테이너 (예 : Form)에 Card을 넣고 해당 컨테이너의 Click (또는 MouseUp) 이벤트에 핸들러를 연결하십시오. 해당 처리기에서 Card 중 하나를 클릭했는지 확인하고 그에 따라 클릭 이벤트를 위임합니다. 이 모든 자체 여부 Card의 독립적 인

참고는 Card의 사용자가 가입 할 수있는 Click 이벤트가 있습니다. 이 답변에서 첫 번째 코드 샘플을 보면 Card의 클릭 이벤트에 대해 알고 싶어하는 CardWatcher과 같은 클래스가없는 한 CardCheckIfClicked 메서드가 실제로 실제 이벤트를 실행해야하는 이유가 없습니다. Card 만 클릭 이벤트에 관심이 있다면 Card.HasBeenClicked(MouseEventArgs e)과 같은 메소드를 만들고 여기에 클릭 처리 코드를 입력하고 CheckIfClicked을 직접 호출 할 수 있습니다.

+0

매우 도움이됩니다. . . . 고마워! – Bigfatty