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


ばぐ  2004-10-18 22:13:56  No: 86077

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


ガッ  2004-10-18 22:26:13  No: 86078

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

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


ぱぐ  2004-10-18 23:28:04  No: 86079

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

        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-19 01:13:00  No: 86080

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


ガッ  2004-10-19 01:57:38  No: 86081

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


java.lang.Nullpo  2004-10-19 03:07:56  No: 86082

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

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


ガッ…  2004-10-19 04:52:31  No: 86083

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


java.lang.Nullpo  2004-10-19 05:51:47  No: 86084

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

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

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

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


ねろ  2004-10-19 06:02:01  No: 86085

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-19 06:05:31  No: 86086

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


ねろ  2004-10-19 06:10:29  No: 86087

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


ねろ  2004-10-19 18:18:39  No: 86088

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加