- PR -

pictureBoxの再描画連続

投稿者投稿内容
ヨンジュン
常連さん
会議室デビュー日: 2003/09/29
投稿数: 22
投稿日時: 2004-02-27 14:43
ある関数の中でpictureBoxのImageに何種類かの画像をセットしながら
for文などで繰り返し表示させようとしているのですが、最後の1枚しか
表示しません。Imageに画像をセットするたびにInvalidate()関数を
呼んでもうまくいきません。
タイマー処理の中で毎回違う画像を表示させるということは上手くいきます。
関数の中で連続再描画は出来ないということでしょうか?

<連続表示してくれないコード>
private void button1_Click(object sender, System.EventArgs e)
{
for(int n = 1; n < 4; n++)
{
string fname = "test" + (n.Tostring()) + ".bmp";
Bitmap bmp = new Bitmap(fname);
pictureBox.Image = bmp;
pictureBox.Invalidate();
}
}

↑を実行すると最後のファイル(test3.bmp)だけが表示されるだけ。

-----------------------------------
<連続表示してくれるコード>

private int fileNo = 1;

private void button1_Click(object sender, System.EventArgs e)
{
timer1.Enabled = true;
}

private void timer1_Tick(object sender, System.EventArgs e)
{
string fname = "test" + (n.Tostring()) + ".bmp";
Bitmap bmp = new Bitmap(fname);
pictureBox.Image = bmp;
pictureBox.Invalidate();
if(fileNo >= 3)
{
fileNo = 1;
}
else
{
fileNo++;
}

↑を実行すると画像が切り替わりながら表示する



Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-27 14:49
「いつ、Windows上に描画するか」ということを考えてください。


再描画(Windowsの方ね)したり、一瞬「寝る」と描いてくれると思います。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-27 14:59
正解はJittaさんが書いた通りですが、Timer使う方法はなにか問題でもあるんですか?
たぶんTimer使うのが一番いいかと思います(表示間隔を設定できるので)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-27 15:41
> (表示間隔を設定できるので)
負荷も軽くなります、よね?


 何らかのアクションで一瞬アニメーションさせたい。一瞬だけでその間に何らかの操作を行うことを期待しているわけではないので、わざわざTimerを使うまでもないのではないか、、、そんなところでしょうか?

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-27 15:45 ]
ヨンジュン
常連さん
会議室デビュー日: 2003/09/29
投稿数: 22
投稿日時: 2004-02-27 16:26
ありがとうございます。
寝ることで解決しました。

P.S.timerを使うほどのことではなかったという推察で正解です!
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-27 16:33
>timerを使うほどのことではなかったという推察で正解です!
なるほど^^;
ちなみに即時再描画はInvalidate後にUpdateメソッドを呼べばできるはずです。
ただ個人的にはこまめにメッセージループに戻ったほうがいいと思うのでヨンジュンさんの
解決方法でいいと思います。
ヨンジュン
常連さん
会議室デビュー日: 2003/09/29
投稿数: 22
投稿日時: 2004-02-27 16:57
Update()試してみました。
できました。色々参考になります!
ありがとうございます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-27 17:14
> 寝ることで解決しました。

 自分で書いておいて「は?」とか思ったり

 描画は重い処理なので、イベントハンドラの処理中、つまり「ユーザのリクエストに応えなければならない」という重要なことをやっている最中にはやらない、ということです。


 SunOSの(って、またかい!)マニュアルには、その辺のことも書いてあったんだけどなぁ。。。

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