|
■No69079 (jun039 さん) に返信 > いつもお世話になっております。 > 毎度のことながら、いろいろと教えていただきありがとうございます。 > > やりたいことは、 > DLLからFormを作成 > 作成されたForm上にあるPictureBoxへ「ある画像」を表示 > を実施したいと思っています。 > > わかる範囲でサイト検索をしたところ、delegateとInvokeの組み合わせを活用すれば > 出来ると書かれており、それを参考に表示することができました。 > > そこで、本題ですが、、、、、 > 「ある画像」は、カメラ画像を元に変換した画像で、それを連続表示させたいのですが、 > 表示先を複数のPictureBox(すでに表示されている複数のForm)へ表示したいと思っています。 > (各FormでTimerを持つのではなく、「ある画像」を変換処理をする側でTimerを利用し > 登録されたForm/PictureBoxに対し表示がしたいのです) > > > イメージ的には、各FormのPictureBoxハンドルをList化して、表示時に繰り返すとわかりやすいのですが、 > delegate/Invokeの組み合わせでどのように表現すればいいのかがわからないです。 > DLLから、どこかのフォームにある1つのPictureBoxを対象として 一定時間の間隔で動画のように画像を更新していくと想定しましたが、間違ってませんか?
一番簡単な形式としては、 Form(EXE)から、DLLに対して、更新対象としてほしいPictureBoxを渡し 一定間隔(DLL側のタイマー)で、画像の更新処理をDLLの中で直接渡したPictureBoxに対して行うという方法ですね。
再描画のタイミングで画像を保持している必要があるので、 表示したい画像は、PictureBox.Image プロパティに格納してしまうのがいいと思います。
画像の更新は、更新間隔までにBitmapを構築し終えていれば、代入文だけで済みます。
この場合、delegate や Invoke メソッドの呼び出しがあるとしても、その処理はDLLの内部で完結しており 外部からは何をやってるかすら考慮する必要がない状態にすることができます。
疑似コード的には class FakeMovie { public PictureBox Picture{ get; set; }
public void Start() { // タイマー発動 } public void Stop() { // タイマー停止 } private void Update() { Bitmap bmp; // カメラから取得した画像の一時的なコピー updateTarget.Image = bmp; // これで更新される。必要があれば自動的に最適な手段で再描画を行う } } という感じのクラスを用意し class ExeForm ... { private FakeMovie fakeMovie = new FakeMovie;
private void ExeForm_Load( object sender, EventArgs e ) { fakeMovie.Picrure = pictureBox1; fakeMovie.Start(); } } という感じで更新スタートさせればいいと思いますよ。 FakeMovie がどこにあるかにかかわりなく、必要とするものは、PictureBox だけだと思いますし。。。
ちなみに、上記コードはコンパイルしたものじゃないので、かなりいい加減ですが、ざっくりとした感じではこれで行けると思います。
> 申し訳ありませんが、わかるかた、ご教授いただければと思います。 > 教授するのは、大変なので教示程度で勘弁してね。
|