• ベストアンサー

PictureBoxの背景色変更(VB.NET)

最近、VB.NETを勉強し始めた初心者です。 スクロールバーとテキストボックスを利用し PictureBoxの背景色を変更させるプログラムを作りたいのですが 色変更のやりかたがわかりません。 赤・緑・青に対応した3本のスクロールバーと3つのテキストボックスを用意し スクロールバーを動かす、もしくはテキストボックスに値を直接入力すし ボタン1を押すと、PictureBoxの背景色が入力した値に応じて変わるように設定します。 スクロールバーを動かした時は、テキストボックスにスクロールバーの値を表示させます。 実行直後は赤・緑・青の全てが0ですので、黒になっています。 (なお、値の最大は255です) また、実行直後のテキストボックスは「0」と表示するようにします。 ボタン2を押すとすべての値が初期化され、実行直後と同じ状態になります。 いろいろと調べたのですが、未だにわからず困っています。 それぞれの配置やスクロールバーの値の範囲設定等はすべて書き終えています。 やりかたがわかるかたがいましたら、教えていただけますか。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

PictureBoxの背景色なら BackColorプロパティです BackColorプロパティは Color構造体のデータを受け取ります Color構造体は RGBの数値から色を作成するには FromArgbメソッドを使います PictureBox1.BackColor = Color.FromArgb( TextBox1.Text, TextBox2.Text, TextBox3.Text) といった具合にします TextBox1が赤 TextBox2が緑 TextBox3が青 といった順番です

laybial
質問者

補足

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

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

逆の操作は if HScrollVar1.Value <> CInt( TextBox1.Text ) Then   HScrollBar1.Value = CInt( TextBox1.Text ) end if といった具合でいいと思いますよ

laybial
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

ごめんなさい m(__)m Color.FromArgb(TextBox1.Text,TextBox2.Text,TextBox3.Text) これは エラーにありますね ・・・ ♯ VB6の癖が付いていて <-- いい訳ですね CInt関数や IntegerのPaurseなどを使って文字列から数値に変換しないといけませんでした 普通のテキストボックスですと文字も入力可能ですよね たとえば『12あ』とか NumericUpDownは数値(数字)しか受け付けません HScrollBarのValueChangedイベントでリアルタイムに色を変更したいのであれば PictureBox1.BackColorを更新する処理も必要です

laybial
質問者

補足

ありがとうございます。 No1~2を参考にさせていただき、実際にやってみましたが 数値を入力、もしくはスクロールバーをいじって 背景色を変更することはできました。 数字以外の文字や空白ですとエラーが出るので それはエラー処理をしたいと思っています。 しかし、スクロールバーをいじらず、テキストボックスにのみ数値を入力し ボタン1(変更)を押したとき、スクロールバーが対応する数値に移動しません。 (色は入力した数値のとおりに変わるのですが スクロールバーが0の位置から動かない状態です) 入力した数値に対応してスクロールさせたいのですが その際に、文字列から数値に変換するのが必要なのでしょうか? たびたびの質問で失礼します……。

回答No.3

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.aspx?PostID=2012622&SiteID=7 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 'こんな感じ?

laybial
質問者

補足

具体的な回答をありがとうございます。 大変助かりました。 一応、質問文に書いた形式で作ってみたいので いただいた回答を参考に、作成してみたいと思います。 蛇足かもしれませんが、テキストボックスで作成しようとすると どういう点が問題になるのでしょうか? 最大入力文字数はあらかじめ設定し、0~255以外の数値が入力された場合は エラーのメッセージボックスを出すようにしようと思いますが やはりNumericUpDownというもののほうが良いでしょうか?

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

テキストボックスより『NumericUpDown』コントロールの方がいいかもしれませんね HScrollBarのValueChangeイベントなどで TextBox1.Text = HScrollBar1.Value などとすれば スクロールバーとテキストボックスの連動が出来ますよ Button2をクリックした際には HScrollBar1.Value = 0 などで初期化してやり PictureBox1.BackColor = Color.Black などとしてみてはいかがでしょう

laybial
質問者

補足

何度もありがとうございます。 こちらを見落としていましたので質問が重複して申し訳ないですが >TextBox1.Text = HScrollBar1.Value これが、スクロールさせたときの動作になるのでしょうか?

関連するQ&A