PictureBoxのBackColorを
赤→緑→青
↑___↓
とループさせる方法を教えてください。
よろしくお願いします。
………………………………ん、こうか?
do
debug.? &hff&*&h100&^i
i=(i+1) mod 3
loop
というかIF文でゴリゴリ書けると思うが…?
…ま、釣られるのはたのすぃからなw
>ガッ様
ありがとうございます。
私は初め、以下のように考えたのですが、何も色がでませんでした。
教えていただいたコードはどのように使えばよろしいのですか?
初心者なもので申し訳ございません。
Do
Sleep(100)
PictureBox1.BackColor = Color.Red
Sleep(100)
PictureBox1.BackColor = Color.Green
Sleep(100)
PictureBox1.BackColor = Color.Blue
Loop
画面をRefresh() してないだけだったりして...
↑たしかにそうですねー…この場合は
Do
PictureBox1.BackColor=RGB(Rnd*255,Rnd*255,Rnd*255)
Doevents
Sleep 1
Loop
とかやってみるといいかもしらん。
………………………………はっ!
新ためてソースコードの添え書きが必要なのを感じたぞっw
(´Д`;)
[↑]なんか、名前が私と「対(つい)」になってる気がするのですが、気のせいですよね?
以前、某サイトで、Javaの課題(宿題)を回答した方と同じ方かしら?
どんな、使い方をするかにも因りますけど、
Sleep() じゃ問題が起きそうな気がします。
そもそもVB6でいいんですか? > 投稿者さん
……ぁ、Color.Redって…ぇ、もしかして.NETのSystem.Drawing.Color構造体!?
それなら範疇外やね。
俺のはVB6で書いてあるから、役に立たない。
>ばぐさん
スレッドなりを使うと良いと思います。
画面上、変わらないように見えるのは、Refresh()していないからでは?
スレッドを使うのがイヤな場合は、Application.DoEvents()でも良いでしょうが。
Sleepにしている部分を以下のようにしてみましょう。
For i = 0 To 1000
Application.DoEvents()
Next i
Sleepの前か後ろにDoEventsを入れればいいだけでは
Do
PictureBox1.BackColor = Color.Red
Application.DoEvents()
Sleep(100)
PictureBox1.BackColor = Color.Green
Application.DoEvents()
Sleep(100)
PictureBox1.BackColor = Color.Blue
Application.DoEvents()
Sleep(100)
Loop
> Sleep(100)
Threading.Thread.Sleep()なら、
GUIに特化してる処理の最中には、あまりお勧めできませんが...
被った!
と思ったがちょっと違うか。
それにしてもSleep(100)は少し短すぎるのでは。
Greenが殆ど見えなくなると思いますが。
Redを50にGreenを200にBlueを100位にすると
視覚的に同じ長さに見えるかも。
>Threading.Thread.Sleep()なら、
多分これはAPIのSleep()でしょう。
Application.DoEvents()の方が宣言をしなくていいので
簡単かな。
>GUIに特化してる処理の最中には、あまりお勧めできませんが...
私もSleepはあまり好きでは有りません、外部の割り込みなんかも
全て受け付けなくなりますし。
とりあえずSleep()の前後にApplication.DoEvents()を入れれば、
メッセージ・キューに溜まった処理を全て吐き出しますので
問題は無いのかなと。
と言うか、「バグ」さんの書いたサンプルコードは、エラーが出ないのに
なぜ色が変わらないのかと言う質問に対して、Windowsのメッセージに関する
多少の知識が必要なのかな。簡単に説明すると、
Windowsは時間のかかる描画等の処理は、他の処理が忙しい場合は描画処理を後回しにして
とりあえずメッセージキューと言う場所に溜め込むわけです。そして処理が暇になった時
やおら、キューから順番に「処理」を取り出して実行するわけです。
ところががサンプルコードの様に、Do〜LoopでGUIの処理を回すと、Windowsは
処理を溜め込むのに忙しくて、実際に描画などの処理をする時間がなくなります。
実際は画面を変えようとLoopを回すのですが、描画をする時間が無いと言う矛盾に
遭遇するわけですね、そこでDoEventsを使用します。
DoEventsと言う命令は、メッセージキューに溜まっている処理を全て実行します。
この関数を適当に挿入することにより、適度な描画が可能になりま。
Sleepの間はWindowsは暇なのではと思うかもしれませんが、Sleepの間はそのスレッドは
処理を全て中断しますから、描画の処理もしません。「java.lang.Nullpo」さんが
「あまりお勧めできません」の理由もこの辺にあるのでしょう。
実際はかなり複雑なので、細部は違っているかもしれませんが、概念的な説明として。
ツイート | ![]() |