1

Form1では、デザイナーにlabel2があり、コードを追加しました。

public void lbl2(string text)
        {
            label2.Text = text;
        }

新しいクラストップに私は追加しました:

private static AnimationEditor.Form1 fr1 = new AnimationEditor.Form1();

そして、新しいクラスイベントでは、次のようにlabel2.Textを更新しています。

int ISampleGrabberCB.BufferCB(double sampleTime, IntPtr pBuffer, int bufferLen)
        {
            using (var bitmap = new Bitmap(_width, _height, _width * 3, PixelFormat.Format24bppRgb, pBuffer))
            {
                bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
                if (SaveToDisc)
                {
                    String tempFile = _outFolder + _frameId + ".bmp";
                    if (File.Exists(tempFile))
                    {
                        fr1.lbl2(_frameId.ToString();
                    }
                    else
                    {
                        bitmap.Save(Path.Combine(_outFolder, _frameId + ".bmp"));
                    }
                    _frameId++;
                }
                else
                {
                    if (Images == null)
                        Images = new List<Bitmap>();
                    Images.Add((Bitmap)bitmap.Clone());
                }
            }
            return 0;
        }

更新を行っているのは次のとおりです。

fr1.lbl2(_frameId.ToString();

ここで、新しいクラスのこの行と、パブリック関数のlabel2.TextのForm1でブレークポイントを使用しました。ラベル2のテキストが、最初に0、次に1、次に2というように変化していることがわかりました。

しかし実際には、アプリケーションを実行しているときにリアルタイムでlabel2は、label2のようにテキストが常に変化します。

これは、Form1ボタンクリックイベントであり、クリックすると新しいクラスコードが実行されます。

private void button5_Click(object sender, EventArgs e)
        {
            wmv = new Polkan.DataSource.WmvAdapter(@"d:\VIDEO0040.3gp", sf);
            wmv.SaveToDisc = true;
            wmv.Start();
            wmv.WaitUntilDone();
        }
4

1 に答える 1

1

簡単な答えは、ラベルの参照をクラスに渡すことだと思います。

private Label lbl;

public WmvAdapter(string file, string outFolder, Label label) {
  // yada-yada-yada
  lbl = label;
}

ルーチンは次のように変更されます。

if (File.Exists(tempFile))
{
  lbl.Text = _frameId.ToString();
}

クリックイベント:

private void button5_Click(object sender, EventArgs e)
{
  wmv = new Polkan.DataSource.WmvAdapter(@"d:\VIDEO0040.3gp", sf, this.Label2);
  wmv.SaveToDisc = true;
  wmv.Start();
  wmv.WaitUntilDone();
}

より長い答えは、クラスにイベントを発生させ、フォームにそれをリッスンさせることです。

クラスにフォームを認識させることは、コーディングの最良の方法ではありません。

于 2012-06-12T22:10:09.083 に答える