- PR -

PictureBoxの描画中にWindowsフォームの操作をしたい

1
投稿者投稿内容
むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-05-28 16:00
こんにちは.

1つのボタンと1つのPictureBoxを持つ,FormをVB.NETで作成しています.
PictureBoxでは,予め座標が記されたファイルをもとに
座標に従って線描画を行います.
PictureBoxに線描画を行っている最中で,ボタンをクリックし,
線描画の処理を止めるプログラムを作成したいと思っています.
ですが,線描画中は,ボタンを押すことができず,
押してしまうと,「応答なし」といわれてしまいます.

http://www.atmarkit.co.jp/fdotnet/dotnettips/312ctrlinvoke/ctrlinvoke.html
上のリンク先を参考にスレッドを立てることも考えてはみたのですが(下記のソース),
改善されません.何かご存知の方がいらしたら,ご教授お願いします.

-----
Class Form
Public Sub PlayLecture()
Dim t As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf worker))
t.Start()
End Sub

Delegate Sub SetFocusDelegate()

Sub SetFocus()
//PictureBoxへの描画処理を行うクラスのメソッドをコール
End Sub

Sub worker()
Invoke(New SetFocusDelegate(AddressOf SetFocus))
End Sub
End Class

囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2008-05-28 16:25
描画をどうやってるんでしょうか?


座標ファイルの読み込みを別スレッドで行い、描画データを取り込む。

そして要所々で、Form か PictureBox の Invalidate を呼び、クライアント領域を無効にする。もちろん別スレッドからなので Control.Invoke 経由で。

Paint イベントで実際の描画を描画データを元に行う。


こんな感じでどうでしょう?
むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-05-28 17:12
囚人さん,ご返答ありがとうございます.

描画ですが,別クラスで次の手順で行っています.
・Imageを対応付けたGraphicsで,DrawLineメソッドを用いて
線を引く.
・線を引いたImageをPictureBoxのBackGroundImageに設定する.

なので,FormのPaintイベントは使用していません.

座標ファイルを読み込みつつ,時間を合わせながら
描画を行いため,このような処理になっています.

このような処理手順に対応できるコーディングの仕方がありましたら,
教えていただきたいです.
よろしくお願いいたします.
からあげ
会議室デビュー日: 2007/12/13
投稿数: 19
投稿日時: 2008-05-28 18:09
引用:

むっくさんの書き込み (2008-05-28 17:12) より:
座標ファイルを読み込みつつ,時間を合わせながら
描画を行いため,



描画のタイミングをコントロールする必要があるのなら、
タイマーを使った方が制御しやすいと思います。
むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-05-28 19:44
からあげさん,返信ありがとうございます.

Timerを使って描画は行う予定です.
しかし,描画中にFormのボタンが押せないのです...
描画中に描画処理を停止したり,停止した個所から描画を再開させたり
したいのですが,どのようにしたらよいのかわかりません.

また,BackgroundWorkerも使ってみましたが,
そもそもBackgroundWorker内ではコントロール処理を記述してはならないそうですし...
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-05-28 20:42
引用:

また,BackgroundWorkerも使ってみましたが,
そもそもBackgroundWorker内ではコントロール処理を記述してはならないそうですし...



PictureBox に直書きしようとするからドン詰まるんです。

必要な大きさの Bitmap を用意して、BackgroundWorker ではその Bitmap に描画を行います。

描画が完了したら、Invoke で適当なメソッドを呼び出して、その Bitmap を PictureBox.Image プロパティにセットすればおkです。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-05-28 21:19
引用:

むっくさんの書き込み (2008-05-28 19:44) より:
しかし,描画中にFormのボタンが押せないのです...



基本的に、
Windowsのウィンドウは単一スレッドでしか
操作できないように作られていますので
他の操作中にボタンを押すというのはなかなか困難です。

が、CreateGraphicsはスレッドセーフです。
これを使えばできます。
オススメしませんが。

シングルスレッドで作業を細切れにしてTimerでBitmapをPictureBoxに設定する、
というので大抵はうまく作れると思います。
むっく
会議室デビュー日: 2007/11/03
投稿数: 18
投稿日時: 2008-05-31 21:05
渋木さん,れいさん,返信ありがとうございます.
こちらのお礼が遅くなっていまい,申し訳ありません.

お二人のご教授の通り,PictureBoxのImageプロパティを使用したところ
思いとおりの動作を行うことができました.
本当にありがとうございました.

今後とも何かあった際には、ご教授頂けると幸いです.
1

スキルアップ/キャリアアップ(JOB@IT)