안녕하세요, 저는 거기에 클래스를 제공하는 방법을 theres 클릭 이벤트가 있는지 궁금 해서요. 예를 들어, 나는 카드 클래스를 가지고 있으며, 사용자가 그 클래스의 (카드의 그림을 표시하는) 사각형을 클릭 할 때를 알 수있는 방법이 있습니까?클래스 클릭 이벤트 C#
이상, 카드 사각형을 클릭하면 어떻게 알 수 있습니까?
안녕하세요, 저는 거기에 클래스를 제공하는 방법을 theres 클릭 이벤트가 있는지 궁금 해서요. 예를 들어, 나는 카드 클래스를 가지고 있으며, 사용자가 그 클래스의 (카드의 그림을 표시하는) 사각형을 클릭 할 때를 알 수있는 방법이 있습니까?클래스 클릭 이벤트 C#
이상, 카드 사각형을 클릭하면 어떻게 알 수 있습니까?
Windows에서 "마우스를 여기"클릭 한 메시지를 얻으려면 창 핸들이 있어야합니다. WinForms에서 Windows.Forms.Control에서 파생 된 모든 항목에는 창 핸들이 있으며 마우스 메시지가 표시됩니다. 이러한 메시지는 .NET MouseDown, MouseUp, MouseClick 등의 이벤트로 자동 변환됩니다.
아마도 카드가 컨트롤이되어야합니다. 그렇지 않은 경우 (예 : 많은 카드 관리 및 드로잉을 담당하는 "손"컨트롤이있는 경우) 해당 컨트롤은 마우스 이벤트 (예 : MouseClick)를 가져와 실제로 클릭 한 카드를 파악해야합니다 컨텍스트 및 마우스 이벤트의 좌표
thx man! 이제 나는 컨트롤을 만드는 법을 배우러 간다. . . – Bigfatty
클래스에 이벤트를 쉽게 추가 할 수 있지만 클래스를 클릭 할 때 클래스가 알 수있는 유일한 방법은 해당 이벤트가 있거나 구성 요소가있는 경우입니다.
그게 바로 컨트롤입니다. 이러한 이벤트를 감지 할 수있는 클래스를 작성해야하는 경우 컨트롤을 만드는 것이 좋습니다.
실제로 문제의 두 부분이 있습니다. 첫 번째는 이벤트를 만들고 두 번째는 뭔가에 연결하는 것입니다. 이벤트를 만들기
은 쉬운 부분이다 : 당신이 그 이벤트에 대한 가입자를 설정할 수 있습니다 다른 곳에서 그런
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 (사실,이 문제의 핵심처럼 보인다) :
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);
}
}
공지 것을 및
는 지적 이벤트 처리기 대리자를 부착합니다 OnEvent
방법의 동작을 재정의, 윈도우는 운영 시스템은 윈도우 인 객체 (즉, 윈도우 핸들이있는 객체)에 이벤트를 전달합니다. .NET 내에서 이것은 Control
의 서브 클래스 인 오브젝트를 의미합니다.
Control
을 직접 하위 클래스로 만들거나 UserControl
과 같은 클래스를 서브 클래 싱하여 디자인보기에서 만드는 다른 컨트롤의 컨테이너가 될 수있는 컨트롤을 만들 수 있습니다 (같은 방식으로) 당신은 양식을 만든다.)
그래서, 당신의 선택은 다음과 같습니다 :
Card
컨트롤 자체를 확인; 양식에 배치하고 클릭 이벤트 (및 기타 이벤트)를 직접 수신 할 수 있습니다. 단점은 각 요소가 Windows에서 창 핸들을 할당하기 때문에 한 번에 많은 요소가 활성화되어 있으면 많은 리소스를 사용할 수 있다는 것입니다.Card
에 대한 컨테이너를 만듭니다. 이 컨테이너 컨트롤은 양식에 배치하고 클릭 이벤트 (및 기타 이벤트)를 직접받을 수 있습니다. 단점은 이러한 클릭 이벤트를 개별 카드에 위임하는 방법을 수동으로 파악해야한다는 것입니다. 실제 Click
이벤트에는 좌표가 포함되어 있지 않으므로 대신 MouseUp
이벤트를 처리해야합니다.Form
)에 Card
을 넣고 해당 컨테이너의 Click
(또는 MouseUp
) 이벤트에 핸들러를 연결하십시오. 해당 처리기에서 Card
중 하나를 클릭했는지 확인하고 그에 따라 클릭 이벤트를 위임합니다. 이 모든 자체 여부 Card
의 독립적 인참고는 Card
의 사용자가 가입 할 수있는 Click
이벤트가 있습니다. 이 답변에서 첫 번째 코드 샘플을 보면 Card
의 클릭 이벤트에 대해 알고 싶어하는 CardWatcher
과 같은 클래스가없는 한 Card
의 CheckIfClicked
메서드가 실제로 실제 이벤트를 실행해야하는 이유가 없습니다. Card
만 클릭 이벤트에 관심이 있다면 Card.HasBeenClicked(MouseEventArgs e)
과 같은 메소드를 만들고 여기에 클릭 처리 코드를 입력하고 CheckIfClicked
을 직접 호출 할 수 있습니다.
매우 도움이됩니다. . . . 고마워! – Bigfatty
Panel 또는 Control과 같은 적절한 "기본"UI 클래스를 캡슐화하거나 확장하려는 경우가 있습니다. WinForms 또는 ASP.NET 또는 WPF를 의미하는 경우에 따라 달라집니다. 그런 다음 클릭 이벤트, 처리 (예 : 마우스가 영역 X 위에있을 때 클릭 만 등록)를 수행 한 다음 클라이언트가 연결할 수있는 자체 이벤트를 게시하십시오. [이벤트 자습서 (C#) - WinForms] (http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx)를 시작해야합니다. 행복한 코딩. –
WPF 또는 WinForms ... 아니면 다른 것? –