2010-12-28 8 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

実際には、問題の2つの部分があります。最初はイベントを作成し、もう1つは何かに接続します。イベントの作成

は簡単な部分です:

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イベントへの応答の二つの方法は通常あること

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); 
    } 
} 

お知らせ:

  1. は、サブクラスのクラスを作成し、どこか(実際には、これはあなたの問題の核心のように思える)、それらのクリックイベントをキャプチャするEED 、および他の回答では、Windowsが動作し、指摘したように、イベントハンドラデリゲート

を取り付けOnEvent方法

  • の動作をオーバーライドシステムは、ウィンドウであるオブジェクト(つまり、ウィンドウハンドルを持つオブジェクト)にイベントを配信する処理を行います。 .NET内では、これはサブクラスであるオブジェクトがControlであることを意味します。

    Controlを直接サブクラス化するか、またはUserControlのようなサブクラスを作成することで、このようなクラスを作成するだけで簡単です。デザインビューで作成した他のコントロールのコンテナにすることもできますフォームを作成します)。

    だから、あなたの選択肢は次のとおりです。

    • Cardコントロール自体を作ります。フォームに配置してクリックイベント(およびその他のイベント)を直接受け取ることができます。欠点は、それぞれがWindowsからウィンドウハンドルを割り当てるため、これらの要素が一度にアクティブな場合は、多くのリソースを使用できることです。
    • Cardのコンテナをコントロールにします。このコンテナコントロールはフォームに配置し、クリックイベント(およびその他のイベント)を直接受け取ることができます。欠点は、これらのクリックイベントを個々のカードに委譲する方法を手動で把握する必要があることです。実際のClickイベントには座標が含まれていないため、おそらくMouseUpイベントを処理する必要があります。
    • 他のコンテナ(Formなど)にCardを入れ、そのコンテナのClick(またはMouseUp)イベントにハンドラをアタッチします。そのハンドラで、Cardのいずれかがクリックされているかどうかを確認し、それに応じてクリックイベントを委任します。このすべてがCard自体がCardのユーザーが購読できることClickイベントがあるかどうかとは無関係であることを

    注意。この回答の最初のコードサンプルを見るとCardのクリックイベントについて知りたいと思っているCardWatcherのクラスがない限り、Cardののメソッドは実際に実際のイベントを発生させる必要はありません。 Cardだけがクリックイベントを気にするのであれば、Card.HasBeenClicked(MouseEventArgs e)のようなメソッドを作成してそこにクリック処理コードを置き、CheckIfClickedに直接呼び出すことができます。

  • +0

    非常に非常に便利です。 。 。 。どうも! – Bigfatty

    関連する問題