プロが教えるわが家の防犯対策術!

最近、VB.NETを勉強し始めた初心者です。

スクロールバーとテキストボックスを利用し
PictureBoxの背景色を変更させるプログラムを作りたいのですが
色変更のやりかたがわかりません。

赤・緑・青に対応した3本のスクロールバーと3つのテキストボックスを用意し
スクロールバーを動かす、もしくはテキストボックスに値を直接入力すし
ボタン1を押すと、PictureBoxの背景色が入力した値に応じて変わるように設定します。
スクロールバーを動かした時は、テキストボックスにスクロールバーの値を表示させます。
実行直後は赤・緑・青の全てが0ですので、黒になっています。
(なお、値の最大は255です)
また、実行直後のテキストボックスは「0」と表示するようにします。
ボタン2を押すとすべての値が初期化され、実行直後と同じ状態になります。

いろいろと調べたのですが、未だにわからず困っています。
それぞれの配置やスクロールバーの値の範囲設定等はすべて書き終えています。
やりかたがわかるかたがいましたら、教えていただけますか。
お願いします。

A 回答 (5件)

PictureBoxの背景色なら BackColorプロパティです



BackColorプロパティは Color構造体のデータを受け取ります
Color構造体は RGBの数値から色を作成するには FromArgbメソッドを使います

PictureBox1.BackColor = Color.FromArgb( TextBox1.Text, TextBox2.Text, TextBox3.Text)
といった具合にします

TextBox1が赤 TextBox2が緑 TextBox3が青 といった順番です

この回答への補足

ありがとうございます。

>PictureBox1.BackColor = Color.FromArgb( TextBox1.Text, TextBox2.Text, TextBox3.Text)

これは、テキストボックスに入力した数値が色として反映されるということでしょうか?
スクロールバーを動かしたときの動作はまた別なのか、それとも同じなのか
よろしければ教えていただくと助かります。
スクロールバーを動かして数値を変更するというのが
申し訳ないのですが、やってみたところいまいちわかりませんでしたので……。

補足日時:2008/02/21 14:48
    • good
    • 0

テキストボックスより『NumericUpDown』コントロールの方がいいかもしれませんね



HScrollBarのValueChangeイベントなどで
TextBox1.Text = HScrollBar1.Value
などとすれば スクロールバーとテキストボックスの連動が出来ますよ

Button2をクリックした際には
HScrollBar1.Value = 0
などで初期化してやり
PictureBox1.BackColor = Color.Black
などとしてみてはいかがでしょう

この回答への補足

何度もありがとうございます。

こちらを見落としていましたので質問が重複して申し訳ないですが

>TextBox1.Text = HScrollBar1.Value

これが、スクロールさせたときの動作になるのでしょうか?

補足日時:2008/02/21 14:52
    • good
    • 0

Option Explicit On


Option Strict On
Option Compare Binary
Option Infer Off ' VB2008以上。SharpDevelop 3 alphaには出てこないや~

Class Q3795334A
Public Shared Sub Main(args As String())
Dim hoge As Q3795334B
hoge = New Q3795334B()
hoge.ShowDialog
End Sub
End Class
Class Q3795334B
Inherits System.Windows.Forms.Form

Private PictureBox1 As System.Windows.Forms.PictureBox
Private Button1 As System.Windows.Forms.Button
Private Button2 As System.Windows.Forms.Button

Private NumericUpDownR As System.Windows.Forms.NumericUpDown
Private NumericUpDownG As System.Windows.Forms.NumericUpDown
Private NumericUpDownB As System.Windows.Forms.NumericUpDown

'最初の予定とはだいぶ違うけどいいよね?これくらい

'>テキストボックスより『NumericUpDown』コントロールの方がいいかもしれませんね
'賛成。テキストボックスでやると,
'System.FormatException
'とか
'System.ArgumentOutOfRangeException
'を気にしないといけない

'中々すばらしくムカつくのでTrackBarを使ってみることに
'http://forums.microsoft.com/MSDN-JA/ShowPost.asp …

Private TrackBarR As System.Windows.Forms.TrackBar
Private TrackBarG As System.Windows.Forms.TrackBar
Private TrackBarB As System.Windows.Forms.TrackBar

Sub New()

Me.Size = New System.Drawing.Size(800,600)
PictureBox1 = New System.Windows.Forms.PictureBox()

Button1 = New System.Windows.Forms.Button()
Button2 = New System.Windows.Forms.Button()

NumericUpDownR = New System.Windows.Forms.NumericUpDown()
NumericUpDownG = New System.Windows.Forms.NumericUpDown()
NumericUpDownB = New System.Windows.Forms.NumericUpDown()


TrackBarR = New System.Windows.Forms.TrackBar()
TrackBarG = New System.Windows.Forms.TrackBar()
TrackBarB = New System.Windows.Forms.TrackBar()


PictureBox1.Width = 400
PictureBox1.Height = 500
PictureBox1.Left = 20
PictureBox1.Top = 20
PictureBox1.BackColor = System.Drawing.Color.White

Button1.Width = 100
Button1.Height = 20
Button1.Left = 420
Button1.Top = 20
Button1.Text = "適用"

Button2.Width = 100
Button2.Height = 20
Button2.Left = 420
Button2.Top = 60
Button2.Text = "リセット"

NumericUpDownR.Width = 50
NumericUpDownR.Height = 20
NumericUpDownR.Left = 420
NumericUpDownR.Top = 100
NumericUpDownR.Maximum = 255
NumericUpDownR.Minimum = 0


NumericUpDownG.Width = 50
NumericUpDownG.Height = 20
NumericUpDownG.Left = 420
NumericUpDownG.Top = 140
NumericUpDownG.Maximum = 255
NumericUpDownG.Minimum = 0

NumericUpDownB.Width = 50
NumericUpDownB.Height = 20
NumericUpDownB.Left = 420
NumericUpDownB.Top = 180
NumericUpDownB.Maximum = 255
NumericUpDownB.Minimum = 0

TrackBarR.Width = 250
TrackBarR.Height = 20
TrackBarR.Left = 480
TrackBarR.Top = 100
TrackBarR.Maximum = 255
TrackBarR.Minimum = 0
TrackBarR.TickFrequency = 10

TrackBarG.Width = 250
TrackBarG.Height = 20
TrackBarG.Left = 480
TrackBarG.Top = 140
TrackBarG.Maximum = 255
TrackBarG.Minimum = 0
TrackBarG.TickFrequency = 10

TrackBarB.Width = 250
TrackBarB.Height = 20
TrackBarB.Left = 480
TrackBarB.Top = 180
TrackBarB.Maximum = 255
TrackBarB.Minimum = 0
TrackBarB.TickFrequency = 10

Reset()

Me.Controls.Add(PictureBox1)

Me.Controls.Add(TrackBarR)
Me.Controls.Add(TrackBarG)
Me.Controls.Add(TrackBarB)

Me.Controls.Add(NumericUpDownR)
Me.Controls.Add(NumericUpDownG)
Me.Controls.Add(NumericUpDownB)

Me.Controls.Add(Button1)
Me.Controls.Add(Button2)

AddHandler TrackBarR.ValueChanged ,AddressOf TrackBar_OnValueChanged
AddHandler TrackBarG.ValueChanged ,AddressOf TrackBar_OnValueChanged
AddHandler TrackBarB.ValueChanged ,AddressOf TrackBar_OnValueChanged

AddHandler NumericUpDownR.ValueChanged ,AddressOf NumericUpDown_OnValueChanged
AddHandler NumericUpDownG.ValueChanged ,AddressOf NumericUpDown_OnValueChanged
AddHandler NumericUpDownB.ValueChanged ,AddressOf NumericUpDown_OnValueChanged

AddHandler Button1.Click, AddressOf Button1_OnClick
AddHandler Button2.Click, AddressOf Button2_OnClick

End Sub

Private Sub TrackBar_OnValueChanged(sender As Object, e As System.EventArgs)
NumericUpDownR.Text = TrackBarR.Value.ToString()
NumericUpDownG.Text = TrackBarG.Value.ToString()
NumericUpDownB.Text = TrackBarB.Value.ToString()
End Sub

Private Sub Button1_OnClick(sender As Object ,e As System.EventArgs)
Dim r As Integer = Decimal.ToInt32(NumericUpDownR.Value)
Dim g As Integer = Decimal.ToInt32(NumericUpDownG.Value)
Dim b As Integer = Decimal.ToInt32(NumericUpDownB.Value)

PictureBox1.BackColor = System.Drawing.Color.FromArgb(255,r,g,b)
End Sub

Private Sub Button2_OnClick(sender As Object ,e As System.EventArgs)
Reset()
End Sub


Private Sub NumericUpDown_OnValueChanged(sender As Object, e As System.EventArgs)
TrackBarR.Value = Decimal.ToInt32(NumericUpDownR.Value)
TrackBarG.Value = Decimal.ToInt32(NumericUpDownG.Value)
TrackBarB.Value = Decimal.ToInt32(NumericUpDownB.Value)
End Sub

Private Sub Reset()

NumericUpDownR.Value = 0
NumericUpDownG.Value = 0
NumericUpDownB.Value = 0

TrackBarR.Value = 0
TrackBarG.Value = 0
TrackBarB.Value = 0

PictureBox1.BackColor = System.Drawing.Color.FromArgb(255,0,0,0)
End Sub

End Class

'こんな感じ?

この回答への補足

具体的な回答をありがとうございます。
大変助かりました。
一応、質問文に書いた形式で作ってみたいので
いただいた回答を参考に、作成してみたいと思います。

蛇足かもしれませんが、テキストボックスで作成しようとすると
どういう点が問題になるのでしょうか?
最大入力文字数はあらかじめ設定し、0~255以外の数値が入力された場合は
エラーのメッセージボックスを出すようにしようと思いますが
やはりNumericUpDownというもののほうが良いでしょうか?

補足日時:2008/02/21 15:00
    • good
    • 0

ごめんなさい m(__)m


Color.FromArgb(TextBox1.Text,TextBox2.Text,TextBox3.Text)
これは エラーにありますね ・・・
♯ VB6の癖が付いていて <-- いい訳ですね

CInt関数や IntegerのPaurseなどを使って文字列から数値に変換しないといけませんでした

普通のテキストボックスですと文字も入力可能ですよね
たとえば『12あ』とか

NumericUpDownは数値(数字)しか受け付けません

HScrollBarのValueChangedイベントでリアルタイムに色を変更したいのであれば
PictureBox1.BackColorを更新する処理も必要です

この回答への補足

ありがとうございます。

No1~2を参考にさせていただき、実際にやってみましたが
数値を入力、もしくはスクロールバーをいじって
背景色を変更することはできました。
数字以外の文字や空白ですとエラーが出るので
それはエラー処理をしたいと思っています。

しかし、スクロールバーをいじらず、テキストボックスにのみ数値を入力し
ボタン1(変更)を押したとき、スクロールバーが対応する数値に移動しません。
(色は入力した数値のとおりに変わるのですが
スクロールバーが0の位置から動かない状態です)
入力した数値に対応してスクロールさせたいのですが
その際に、文字列から数値に変換するのが必要なのでしょうか?

たびたびの質問で失礼します……。

補足日時:2008/02/22 00:42
    • good
    • 0

逆の操作は



if HScrollVar1.Value <> CInt( TextBox1.Text ) Then
  HScrollBar1.Value = CInt( TextBox1.Text )
end if
といった具合でいいと思いますよ
    • good
    • 0
この回答へのお礼

ありがとうございました!できました!
本当に助かりました。

お礼日時:2008/02/22 12:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています