1

これは私のコントロールのコンテキストです:

/*
Form
    StatusStrip
        ToolStripStatusLabel

    TableLayoutPanel
        MyGenioView
*/

そのため、MyGenioViewMouseMoveイベント ハンドラーをインターセプトしています。既に存在するコードは、ラバー バンドの四角形用です。ので、私は持っています:

public void MyMouseMove(Object sender, MouseEventArgs e)
{
    Point ptCurrent = new Point(e.X, e.Y);
    // If we "have the mouse", then we draw our lines.
    if (m_bHaveMouse)
    {
        // If we have drawn previously, draw again in
        // that spot to remove the lines.
        if (m_ptLast.X != -1)
        {
            MyDrawReversibleRectangle(m_ptOriginal, m_ptLast);
        }
        // Update last point.
        m_ptLast = ptCurrent;
        // Draw new lines.
        MyDrawReversibleRectangle(m_ptOriginal, ptCurrent);
    }

    // New code here
}

私が理解できないのは、ハンドラーstatusStrip1.statusLabelからの値を設定したいということです。MyGenioView MouseMoveやり方が思いつかない。

使用したいコードは次のとおりです。

OdGePoint3d pt = GetWorldCoordinates(ptCurrent);
String strCoordinate = String.Format("{0},{1}", ptCurrent.X, ptCurrent.Y);

statusStripしかし、それをメイン フォームオブジェクトにフィードする正しい方法は何でしょうか?

ご協力いただきありがとうございます。

アップデート:

statusStrip ラベル オブジェクトのテキストを設定する方法を知っています。それは私の問題ではありません。私の問題は、マウス ハンドラー イベントのコンテキストと、フォームとの関係に関連しています。質問の冒頭で説明されているように、コントロールのコンテキストを参照してください。これまでのコメントでは、それが考慮されていません。

これは、オブジェクト (マウス ハンドラーを受け取る)を作成するフォーム内の現在の場所です。MyGenioView

private void viewToolStripMenuItem_Click(object sender, EventArgs e)
{
    OdDbDatabase TDDatabase = m_oGenioView.GetDatabase();

    if (m_oGenioViewCtrl != null)
        m_oGenioViewCtrl.DeleteContext();

    tableLayoutPanel.RowCount = 1;
    tableLayoutPanel.ColumnCount = 1;
    m_oGenioViewCtrl = new MyGenioView();
    m_oGenioViewCtrl.TDDatabase = TDDatabase;
    m_oGenioViewCtrl.ResetDevice(true);
    m_oGenioViewCtrl.Dock = DockStyle.Fill;
    m_oGenioViewCtrl.Margin = new Padding(1);
    tableLayoutPanel.Controls.Add(m_oGenioViewCtrl);
}
4

1 に答える 1

4

ステータスを更新するには、複数のオプションがあります。

  1. Action<Point>ユーザー コントロールに を挿入する
  2. StatusUpdateユーザー コントロールでイベントを作成する
  3. また、コントロールの階層を使用してコントロールにアクセスすることもできます。たとえば、ユーザー コントロールは親フォームであり、コレクションを使用するか、フォームでパブリックにすることによってthis.ParentForm、ターゲット コントロールを見つけることができます。Controls

最初の 2 つのオプションは、コントロールをフォームから切り離し、ユーザー コントロールを多くのフォームや他のコンテナーでこの方法で使用できるため、はるかに優れています。ステータスを更新する方法を提供するかどうかは、コンテナー次第です。

最良のオプションは、イベントを作成して消費することです。

1-Action<Point>ユーザーコントロールに挿入します

ユーザーAction<Point>コントロールに を挿入し、 で使用しMouseMoveます。これを行うには、これをユーザー コントロールに入れます。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public Action<Point> StatusUpdate{ get; set; }

//Don't forget to assign the method to MouseMove event in your user control 
private void UserControl1_MouseMove(object sender, MouseEventArgs e)
{
    if (StatusUpdate!= null)
        StatusUpdate(e.Location);
}

そして、このコードをフォームに置きます:

private void Form1_Load(object sender, EventArgs e)
{
    this.userControl11.StatusUpdate= p => this.toolStripStatusLabel1.Text=p.ToString();
}

2-StatusUpdateユーザー コントロールでイベントを作成する

StatusUpdateユーザーコントロールでイベントを作成し、それをMouseMove発生させ、フォームでイベントを消費します。MouseMoveまた、イベント自体を使用することもできます。

これを行うには、次のコードをユーザー コントロールに配置します。

public event EventHandler<MouseEventArgs> StatusUpdate;
public void OnStatusUpdate(MouseEventArgs e)
{
    var handler = StatusUpdate;
    if (handler != null)
        handler(this, e);
}

//Don't forget to assign the method to MouseMove event in your user control 
private void UserControl1_MouseMove(object sender, MouseEventArgs e)
{
    OnStatusUpdate(e);
}

そしてフォームに入れて、このコードを入れてください:

//Don't forget to assign the method to StatusUpdate event in form  
void userControl11_StatusUpdate(object sender, MouseEventArgs e)
{
    this.toolStripStatusLabel1.Text = e.Location.ToString();
}
于 2016-05-27T12:50:26.070 に答える