- - PR -
pictureBoxの再描画連続
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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++; } ↑を実行すると画像が切り替わりながら表示する |
|
投稿日時: 2004-02-27 14:49
「いつ、Windows上に描画するか」ということを考えてください。
再描画(Windowsの方ね)したり、一瞬「寝る」と描いてくれると思います。 |
|
投稿日時: 2004-02-27 14:59
正解はJittaさんが書いた通りですが、Timer使う方法はなにか問題でもあるんですか?
たぶんTimer使うのが一番いいかと思います(表示間隔を設定できるので) |
|
投稿日時: 2004-02-27 15:41
> (表示間隔を設定できるので)
負荷も軽くなります、よね? 何らかのアクションで一瞬アニメーションさせたい。一瞬だけでその間に何らかの操作を行うことを期待しているわけではないので、わざわざTimerを使うまでもないのではないか、、、そんなところでしょうか? [ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-27 15:45 ] |
|
投稿日時: 2004-02-27 16:26
ありがとうございます。
寝ることで解決しました。 P.S.timerを使うほどのことではなかったという推察で正解です! |
|
投稿日時: 2004-02-27 16:33
>timerを使うほどのことではなかったという推察で正解です!
なるほど^^; ちなみに即時再描画はInvalidate後にUpdateメソッドを呼べばできるはずです。 ただ個人的にはこまめにメッセージループに戻ったほうがいいと思うのでヨンジュンさんの 解決方法でいいと思います。 |
|
投稿日時: 2004-02-27 16:57
Update()試してみました。
できました。色々参考になります! ありがとうございます。 |
|
投稿日時: 2004-02-27 17:14
> 寝ることで解決しました。
自分で書いておいて「は?」とか思ったり 描画は重い処理なので、イベントハンドラの処理中、つまり「ユーザのリクエストに応えなければならない」という重要なことをやっている最中にはやらない、ということです。 SunOSの(って、またかい!)マニュアルには、その辺のことも書いてあったんだけどなぁ。。。 |