0

MouseMove でカスタム イベントを発生させるカスタム コントロールのインスタンスがいくつかあります。コードは次のとおりです: EventArgs クラス:

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

制御クラス:

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

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

前もってありがとう、イヴァン。

4

1 に答える 1

2

オプション1

コントロールで静的イベントを使用します

 public static event GroupMoveEventHandler GroupMoveEvent;

次に、イベントハンドラーも静的である必要があります

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

コメントに記載されているように、静的イベントを次のように参照してください。

 GroupMoveEventHandler -= OnGroupMoveEvent;

詳細が必要な場合は、静的イベントの例を次に示します

オプション 2

コントロールを含むフォームにイベントハンドラーを配置し、すべてのインスタンスコントロールを作成した後、フォーム内の単一のイベントハンドラーをコントロールのイベントに割り当てます

フォームで

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

public delegate void GroupMoveEventHandler(object sender, GroupMoveEventArgs e); 公開イベント 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));
         }
      }
    }  
于 2012-05-11T11:48:39.497 に答える