C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 外部DLLにて作成した画像を任意のPictureBoxへ表示


(過去ログ 118 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■69079 / inTopicNo.1)  外部DLLにて作成した画像を任意のPictureBoxへ表示
  
□投稿者/ jun039 (5回)-(2013/12/02(Mon) 15:27:25)

分類:[C#] 

いつもお世話になっております。
毎度のことながら、いろいろと教えていただきありがとうございます。

やりたいことは、
 DLLからFormを作成
 作成されたForm上にあるPictureBoxへ「ある画像」を表示
を実施したいと思っています。

わかる範囲でサイト検索をしたところ、delegateとInvokeの組み合わせを活用すれば
出来ると書かれており、それを参考に表示することができました。

そこで、本題ですが、、、、、
「ある画像」は、カメラ画像を元に変換した画像で、それを連続表示させたいのですが、
表示先を複数のPictureBox(すでに表示されている複数のForm)へ表示したいと思っています。
(各FormでTimerを持つのではなく、「ある画像」を変換処理をする側でTimerを利用し
 登録されたForm/PictureBoxに対し表示がしたいのです)


イメージ的には、各FormのPictureBoxハンドルをList化して、表示時に繰り返すとわかりやすいのですが、
delegate/Invokeの組み合わせでどのように表現すればいいのかがわからないです。

申し訳ありませんが、わかるかた、ご教授いただければと思います。

よろしくお願いします。

*******************************************
OS :Windows7 32bit
開発環境:Visual Studio 2010 C#




引用返信 編集キー/
■69087 / inTopicNo.2)  Re[1]: 外部DLLにて作成した画像を任意のPictureBoxへ表示
□投稿者/ 魔界の仮面弁士 (444回)-(2013/12/03(Tue) 11:53:47)
No69079 (jun039 さん) に返信
> DLLからFormを作成
> 作成されたForm上にあるPictureBoxへ「ある画像」を表示
PictureBox への描画には、Paint イベント(e.Graphics)を使いますよね。

呼び出し元(EXE)側で生成した PictureBox であっても
呼び出し先(DLL)側で生成した PictureBox であっても
その原則は変わらないと思います。

なので、DLL 側のクラスで、「描画イベント」を公開し、
PictureBox の Paint イベント発生時に、それを発火するという
実装になるかと思います。


>「ある画像」を変換処理をする側でTimerを利用し
> 登録されたForm/PictureBoxに対し表示がしたいのです
PictureBox の Invalidate または Update を呼び出すためのメソッドを
DLL 側に用意しておき、それを呼び出し元の Timer で使えば良いかと。
http://dobon.net/vb/dotnet/control/refreshupdateinvalidate.html
引用返信 編集キー/
■69088 / inTopicNo.3)  Re[2]: 外部DLLにて作成した画像を任意のPictureBoxへ表示
□投稿者/ とっちゃん (179回)-(2013/12/03(Tue) 13:22:17)
とっちゃん さんの Web サイト
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 だけだと思いますし。。。

ちなみに、上記コードはコンパイルしたものじゃないので、かなりいい加減ですが、ざっくりとした感じではこれで行けると思います。


> 申し訳ありませんが、わかるかた、ご教授いただければと思います。
>
教授するのは、大変なので教示程度で勘弁してね。

引用返信 編集キー/
■69090 / inTopicNo.4)  Re[1]: 外部DLLにて作成した画像を任意のPictureBoxへ表示
□投稿者/ shu (442回)-(2013/12/03(Tue) 16:20:37)
No69079 (jun039 さん) に返信

delegateとInvokeの組み合わせで処理するというのはUIスレッドではないスレッドで処理
する場合の話かと思います。UIスレッドで実行するのであればDLL側のメンバの公開または
DLLにEXE側のオブジェクトを渡す方法で処理できると思います。

実際に書かれたコードを提示されないと実装された処理に合った回答を得られない可能性が高くなります。
引用返信 編集キー/
■69137 / inTopicNo.5)  Re[1]: 外部DLLにて作成した画像を任意のPictureBoxへ表示
□投稿者/ Jitta (118回)-(2013/12/05(Thu) 22:05:17)
Jitta さんの Web サイト
No69079 (jun039 さん) に返信
ちょっとごめんね。

> やりたいことは、
>  DLLからFormを作成
>  作成されたForm上にあるPictureBoxへ「ある画像」を表示
> を実施したいと思っています。

やりたいことは、
 DLL で Form を作成
 DLL で作成した Form 上の PictureBox へ、別のモジュールから画像を表示

ですかね?


> イメージ的には、各FormのPictureBoxハンドルをList化して、表示時に繰り返すとわかりやすいのですが、
> delegate/Invokeの組み合わせでどのように表現すればいいのかがわからないです。

 delegate と invoke を、「使わなければならない」のですか?
それは、あなたが調べた結果、つまり「目的を達成するための方法の1つ」であって、
「目的」ではないですよね?

 他のモジュールにあろうとなかろうと、
変更しようとするオブジェクトの持ち主の許可をもらわないと、
勝手に変えることはできません。
この場合、「変更しようとするオブジェクト」は PictureBox(の Image プロパティ)で、
「持ち主」は、DLL で作成した Form です。
ですから、DLL が作成する Form に、「絵を表示する」ためのインタフェースがあれば、実現できます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -