2012-05-11 11 views
0

MouseMoveでカスタムイベントを発生させるカスタムコントロールのインスタンスがいくつかあります。 ここでは、コードです: のEventArgsクラス:「グローバル」WinFormsイベント

public class GroupMoveEventArgs 
{ 
    public enum Action { CalcOffset, Move }; 
    Action action; 
    int mouse_x; 
    int mouse_y; 

    // setters missed here 

    public GroupMoveEventArgs(GroupMoveEventArgs.Action action, 
     int mouse_x, int mouse_y) 
    { 
     this.action = action; 
     this.mouse_x = mouse_x; 
     this.mouse_y = mouse_y; 
    } 
} 

Controlクラスは:

public delegate void GroupMoveEventHandler(object sender, GroupMoveEventArgs e); 
public event GroupMoveEventHandler GroupMoveEvent; 

protected virtual void figureMouseMove(object sender, MouseEventArgs e) 
{ 
    if (mouseDown) 
    { 
     if (inGroup) 
     { // raising the event 
      if (this.GroupMoveEvent != null) 
       GroupMoveEvent(this, new GroupMoveEventArgs(
           GroupMoveEventArgs.Action.Move, 
           Parent.PointToClient(Control.MousePosition).X, 
           Parent.PointToClient(Control.MousePosition).Y)); 
     } 
    } 
} 

protected virtual void OnGroupMoveEvent(object sender, GroupMoveEventArgs e) 
{ 
    Console.WriteLine("Got mouse move event " + this.num_of_points); 
    if (inGroup) 
    { 
     if (e.EventAction == GroupMoveEventArgs.Action.Move) 
     { 
      Location = new Point(e.MouseX - offset.X, e.MouseY - offset.Y); 
     } 
     else 
     if (e.EventAction == GroupMoveEventArgs.Action.CalcOffset) 
     { 
      Control c = sender as Control; 
      Point pnt = Parent.PointToClient(Control.MousePosition); 
      Point tmp = c.Location; 
      offset.X = pnt.X - tmp.X; 
      offset.Y = pnt.Y - tmp.Y; 
     } 
    } 
} 

問題は、私がイベントを発生させるとき、私がすべてのコントロールを必要とするとき、送信者のみによって処理されていることですそれを処理する。どうやってやるの?

ありがとうございます、Ivan。

+0

はすべて同じ形式のこれらのコントロールですか? –

+0

はい、同じフォームにあります。 –

+0

テキストボックスコントロールがこのイベントにどのように関心を持っているのか、見えにくいです。一般的に、フォームにはイベントハンドラがあり、それに関心のあるコントロールのメソッドを呼び出す必要があります。 –

答えて

1

オプション1

私は、あなたのイベントハンドラは、同様に静的である必要があるだろう制御

public static event GroupMoveEventHandler GroupMoveEvent; 

の静的イベントを使用することになり

protected static virtual void 
        OnGroupMoveEvent(object sender, GroupMoveEventArgs e) 
{ 

コメントに記載されているように、あなたの静的なevあなたはより多くの情報

オプション2

がコントロールを含むフォームで、すべてのインスタンスを行った後、あなたのイベントハンドラを入れたい場合は、ここでは、この

GroupMoveEventHandler -= OnGroupMoveEvent; 

などのENTはStatic Eventsの一例ですコントロールは、フォームにある単一のイベントハンドラーをコントロールからのイベントに割り当てます。

Control c = new control(); 
c.GroupMoveEventHandler += figureMouseMove(object sender, MouseEventArgs e); 

public delegate void GroupMoveEventHandler(Object sender、GroupMoveEventArgs); publicイベントGroupMoveEventHandler GroupMoveEvent;

protected virtual void figureMouseMove(object sender, MouseEventArgs e) 
{ 
    if (mouseDown) 
    { 
     if (inGroup) 
     { // raising the event 
       if (this.GroupMoveEvent != null) 
       GroupMoveEvent(this, new GroupMoveEventArgs(
           GroupMoveEventArgs.Action.Move, 
           Parent.PointToClient(Control.MousePosition).X, 
           Parent.PointToClient(Control.MousePosition).Y)); 
     } 
     } 
    } 
+0

私はあなたがもっと助けを必要とする場合は、これを多かれ少なかれカバーし、尋ねます。 –

+1

静的イベントには注意してください*明示的にサブスクライブ解除する必要があります。そうしないと、リークが発生します。 –

+0

良いコール私はそれを知らなかった –

関連する問題