背景を連続で変化させるには?


ばぐ  2004-10-18 13:13:56  No: 86077  IP: [192.*.*.*]

PictureBoxのBackColorを
赤→緑→青
↑___↓
とループさせる方法を教えてください。
よろしくお願いします。

編集 削除
ガッ  2004-10-18 13:26:13  No: 86078  IP: [192.*.*.*]

………………………………ん、こうか?
do
   debug.? &hff&*&h100&^i
   i=(i+1) mod 3
loop

というかIF文でゴリゴリ書けると思うが…?
…ま、釣られるのはたのすぃからなw

編集 削除
ぱぐ  2004-10-18 14:28:04  No: 86079  IP: [192.*.*.*]

>ガッ様
ありがとうございます。
私は初め、以下のように考えたのですが、何も色がでませんでした。
教えていただいたコードはどのように使えばよろしいのですか?
初心者なもので申し訳ございません。

        Do
            Sleep(100)
            PictureBox1.BackColor = Color.Red
            Sleep(100)
            PictureBox1.BackColor = Color.Green
            Sleep(100)
            PictureBox1.BackColor = Color.Blue
        Loop

編集 削除
java.lang.Nullpo  2004-10-18 16:13:00  No: 86080  IP: [192.*.*.*]

画面をRefresh() してないだけだったりして...

編集 削除
ガッ  2004-10-18 16:57:38  No: 86081  IP: [192.*.*.*]

↑たしかにそうですねー…この場合は
Do
  PictureBox1.BackColor=RGB(Rnd*255,Rnd*255,Rnd*255)
  Doevents
  Sleep 1
Loop
とかやってみるといいかもしらん。
………………………………はっ!
新ためてソースコードの添え書きが必要なのを感じたぞっw
(´Д`;)

編集 削除
java.lang.Nullpo  2004-10-18 18:07:56  No: 86082  IP: [192.*.*.*]

[↑]なんか、名前が私と「対(つい)」になってる気がするのですが、気のせいですよね?
以前、某サイトで、Javaの課題(宿題)を回答した方と同じ方かしら?

どんな、使い方をするかにも因りますけど、
Sleep() じゃ問題が起きそうな気がします。
そもそもVB6でいいんですか? > 投稿者さん

編集 削除
ガッ…  2004-10-18 19:52:31  No: 86083  IP: [192.*.*.*]

……ぁ、Color.Redって…ぇ、もしかして.NETのSystem.Drawing.Color構造体!?
それなら範疇外やね。
俺のはVB6で書いてあるから、役に立たない。

編集 削除
java.lang.Nullpo  2004-10-18 20:51:47  No: 86084  IP: [192.*.*.*]

>ばぐさん
スレッドなりを使うと良いと思います。
画面上、変わらないように見えるのは、Refresh()していないからでは?

スレッドを使うのがイヤな場合は、Application.DoEvents()でも良いでしょうが。

Sleepにしている部分を以下のようにしてみましょう。

For i = 0 To 1000
    Application.DoEvents()
Next i

編集 削除
ねろ  2004-10-18 21:02:01  No: 86085  IP: [192.*.*.*]

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

編集 削除
java.lang.Nullpo  2004-10-18 21:05:31  No: 86086  IP: [192.*.*.*]

> Sleep(100)
Threading.Thread.Sleep()なら、
GUIに特化してる処理の最中には、あまりお勧めできませんが...

編集 削除
ねろ  2004-10-18 21:10:29  No: 86087  IP: [192.*.*.*]

被った!
と思ったがちょっと違うか。
それにしてもSleep(100)は少し短すぎるのでは。
Greenが殆ど見えなくなると思いますが。
Redを50にGreenを200にBlueを100位にすると
視覚的に同じ長さに見えるかも。

編集 削除
ねろ  2004-10-19 09:18:39  No: 86088  IP: [192.*.*.*]

>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」さんが
「あまりお勧めできません」の理由もこの辺にあるのでしょう。
実際はかなり複雑なので、細部は違っているかもしれませんが、概念的な説明として。

編集 削除