PictureBoxに画像

タグの編集
投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/12 16:56:39
Form1のボタンをクリックするとForm2のPictureBoxに画像を表示するには
どうすればよいか教えて下さい。。。m(_ _)m
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/6/12 17:18:15
「やりたいこと」と「わからないこと」を整理しましょう。

(1) Form2 ではなく、Form1 自身の PictureBox1 を操作することはできますか?
 → Button を押した時の処理は、Button の Click イベントに記述します。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

  

(2) PictureBox に画像を表示させる方法は分かりますか?
 → 画像ファイルを表示させるには、PictureBox の Load メソッドを使います。
PictureBox1.Load("C:\temp\test.jpg")
 → あるいは、PictureBox の Image プロパティにロード済みの画像を渡す方法もあります。


(3) Form2 を表示させる方法は分かりますか?
 → Form2 のインスタンスを生成した後、その Show メソッドを呼び出します。具体的な手順は、
  このサイトの初級講座「第29回 2つ目のフォーム」が参考になるかと思います。
 http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard29.htm


(4) Form2 の PictureBox を操作するには?
 → Form2 の表示時に画像情報を送るなら、(3) の「4.パラメータを送る」が参考になります。
 → すでに表示済みの Form2 を操作するなら、Form2 側に画像情報を受け取って表示するための
  メソッドを用意してそれを呼び出すようにします。
 → もしくは、デザイン時に PictureBox の Modifiers を Friend または Public にしているなら、
  Form1 から (2) と同様の手順で「子.PictureBox1.Load(ファイル名) 」などとすることもできます。
投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/12 17:33:49
「子」ってなんですか??
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/6/12 18:46:03
> 「子」ってなんですか?? 
今回の場合は、Form2 のインスタンスを格納した変数の事です。
前回紹介した初級講座の第29回でいえば、リスト2における変数 f のことです。


初級講座の第29回でも、「親フォーム」「子フォーム」といった表現が出てきますね。

ある画面から別の画面を呼び出す場合において、
呼び出す側の画面を「親」、呼び出される側を「子」と呼びます。


たとえば、「メモ帳」(notepad.exe)を起動し、そこに何か適当な文字を入れてみてください。
そして、メニューから[編集]-[検索]を選択します。「検索」画面が表示されるはずです。

この場合、メモ帳の編集画面が「親」、検索画面は「子」となります。

親子関係にあるため、親を閉じると子も自動的に閉じられます。
たとえば、メモ帳を終了すると検索画面も終了します。
投稿者 (’▽’)ノシ   (中学生) 投稿日時 2012/6/13 17:56:26
form2に画像がでるようになりましたが、
クリックしないと画像が表示されません・・・

どうしたらいいでしょうか??
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2012/6/13 18:44:48
> クリックしないと画像が表示されません・・・
最初に表示される段階で表示させておきたいなら、
  f = New Form2()
  f.PictureBox1.Load( 画像ファイル )
  f.Show()
のように、子フォームを Show する前に画像をセットしておくことができます。

そもそもは、『クリックするとForm2のPictureBoxに画像を表示する』のが
目的だったと思いますが、それ以外のタイミングでも画像を表示させたいという事でしょうか?


Button の Click イベントに処理を書けば、ボタンをクリックしたときに画像が読み込まれます。

Form の Load イベントやコンストラクタ(New)内に処理を書けば、
フォームが最初に起動される段階で画像が読み込まれます。

Form の Shown イベントに処理を書けば、フォームが最初に表示されるときに
画像が読み込まれます。

Timer の Tick イベントに処理を書けば、一定時間経過するごとに
画像が繰り返し読み込まれます。


どのようなタイミングで画像を表示させたいのかに応じて、
目的に合った場所にコードを記述してみてください。
投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/14 16:53:00
できました!

ほんとにありがとうございました。
投稿者 (’▽’)ノシ   (中学生) 投稿日時 2012/6/14 17:42:00
Form1のボタンをクリックするとForm2のLabelに文字が表示されるのはどうやってやるか教えてください。


何度もすみません・・
VB初心者なもので・・・
投稿者 るきお  (社会人) 投稿日時 2012/6/14 20:30:16
一例です。

Form2をはじめて表示するタイミングであれば次の通りです。
Form1側
Dim f2 As New Form2
f2.Label1.Text = "文字"
f2.Show()


既に表示してあるForm2に対して命令するのであれば、Form2を表示するときに使った変数に対して命令します。
次の例はButton1をクリックするとForm2を表示し、その次にButton2をクリックするとLabelに文字を表示します。

Public Class Form1

    Dim f2 As Form2
   
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        f2 = New Form2
        f2.Show()

    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click

        f2.Label1.Text = "文字"

    End Sub
End Class
投稿者 (削除されました)  () 投稿日時 2012/6/14 23:36:14
(削除されました)
投稿者 m190  (社会人) 投稿日時 2012/6/15 07:01:09
> 何度もすみません・・
> VB初心者なもので・・・ 

新たに、自分がやりたいこと、分からないこと、が出てきたような場合には、
すでに、自分で出来るようになったこと、自分が知っていること、などが
とても重要な手がかりとなります。


たとえば今回の件であれば、PictureBox を「Label」に、画像を「文字」に、
置き換えて考えてみると良いと思います。その上で、魔界の仮面弁士 さんの

>「やりたいこと」と「わからないこと」を整理しましょう。
をもう1度読み返してみると
#PictureBox を「Label」に、画像を「文字」に、置き換えてみてください

> (1) Form2 ではなく、Form1 自身の PictureBox1 を操作することはできますか?
> (2) PictureBox に画像を表示させる方法は分かりますか?
> (3) Form2 を表示させる方法は分かりますか?
> (4) Form2 の PictureBox を操作するには?
>  → Form2 の表示時に画像情報を送るなら、・・・
>  → すでに表示済みの Form2 を操作するなら、・・・
>  → もしくは、デザイン時に PictureBox の・・・


おそらく最初のうちは「何が分からないのかさえ分からない」状態だったものが
整理して読み返してみると「自分は何が分かっていて、何が分かっていないのか」
少しは見えてきたのではないかと思います。

・・・ひょっとしたら
自分が「気付いてない」というだけで、実はもうすでに「答えを知っていた!」
なんてことだって、良くあることだと思います。

もちろん全てのことが既存の知識や経験だけで解決できる訳ではありませんし、
解決の方法も様々ですから、質問することを恥ずかしがる必要はありません。
ただ、それでも、
もし自分一人の力で解決できちゃったりすると「案外自分もやれば出来るじゃん!」
って感じにチョッとだけ嬉しい気分が味わえたりするので、一石二鳥ではないかな?
、、、などと思いました。
#頑張ったときには自分で自分のこと、ほめてあげるのも忘れずにね!
投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/15 16:03:35
できました!
ありがとうございました。



また、Form1のボタンを押すとForm2の背景が変わるというのはどうやってやるんでしょうか・・?
これがどうしてもできなくて・・泣



何度も似たような質問申し訳ないです

投稿者   (社会人) 投稿日時 2012/6/16 07:18:29
> Form1のボタンを押すとForm2の背景が変わるというのはどうやってやるんでしょうか・・?
> これがどうしてもできなくて・・泣

とのことですが、「回答する側」にとっても
(’▽’)ノシ さんご自身で「出来るようになったこと」や「分かっていること」というのは
ものすごーく重要な手がかりとなります。


なので
> 1)まず Form1に対して「手作業で」背景を変えることは出来ますか?
ひとくちに背景を変えるといっても、背景色を変更するとか背景の画像を変更する
とか色々ありますが↓のページが参考になると思います。

入門講座・第3回 プロパティをいじろう
http://homepage1.nifty.com/rucio/VBNyumon/BEGIN3.htm
→フォームの背景に画像を指定する (BackgroundImageプロパティ)
→フォームの背景色を赤にする (BackColorプロパティ)、などが載っています


もし、1)が出来たとしたら、

> 2)今度は手作業ではなく「プログラムから」Form1の背景を変えられますか?
この辺りが上手くいかないのであれば、↓のページが参考になると思います。

入門講座・第4回 イベントを逃すな
http://homepage1.nifty.com/rucio/VBNyumon/BEGIN4.htm
→Form1の背景画像(Me.BackgroundImage)の設定例が載ってます

初級講座・第1回 色をあやつる
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard1.htm
→ Form1の背景色(Me.BackColor)を変更する例が載っています


さらに、2)も大丈夫!となれば

> 3)次はいよいよ「Form2を表示させる」ですが、
これはすでに 魔界の仮面弁士 さんがご紹介して下さったページが参考になりますね。
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard29.htm

#実はこの辺り↓ともビミョーに絡んできます。
> 4) Form2 の 背景を変えるには?


おそらく、ここら辺で一番混乱しちゃうのは、
どのタイミングで操作するのか、という部分ではないかと思います。
たとえば、一言で Form2を操作する、と言っても

> A) デザイン画面で(プログラムを実行する前に)、Form2の設定をしておく
> B) Form2 を表示させるタイミングで、Form2に対し何かの処理を行いたい
> C) すでにForm2 を表示している段階で、Form2に対して何か操作をしたい

などなど、それぞれで微妙にやり方が変わってきちゃうんですね。同じコードなのに
「それを何処に書くのか」で実行されるタイミングが変わってきちゃうんです。
どんな感じかと言うと、これまでに
(’▽’)ノシ さんご自身で「出来るようになったこと」を思い出していただきたいのですが、、、

> form2に画像がでるようになりましたが、
> クリックしないと画像が表示されません・・・
これはコードを「ボタンをクリックしたときに実行される場所」に書いていたからです。
、、、よね?

> できました!

また
> Form2のLabelに文字が表示されるのはどうやってやるか教えてください。
についても、るきお先生 のコード例を基に、
#Form2をはじめて表示するタイミングであれ、Button2をクリックするタイミングであれ
Form2 の Label に文字を表示することは出来ましたよね。

> できました!
> ありがとうございました。

で、このとき記述した場所こそ異なりますが、Form2 の Label に文字を表示させるコードは、どちらも
> f2.Label1.Text = "文字" 
という同じコードでした。

要するに、
同じコードでも記述する場所が違えば、実行されるタイミングも違う、、、という辺りまでは
何となーくイメージできてるんだろうな?・・・ということにして次に進みたいと思います。

#もし良く分からなかったら「分からない部分」を質問してくださいね

ひと休み


さて、上の方で紹介したページの、フォームの背景色を赤にするコードや
背景画像を設定するコードなんですが

> Me.BackColor = Color.Red
> Me.BackgroundImage = Image.FromFile("C:\Windows\大草原の風.bmp")

これらのコードは分かりますでしょうか?
もうチョッと具体的に言うと、Me ってどんな意味合いだか分かりますか?

第4回 イベントを逃すな
http://homepage1.nifty.com/rucio/VBNyumon/BEGIN4.htm
たとえば↑このページの説明では

> Me (Me = ミー)はこの場合はフォームのことです。
とありますが、これを少し具体的に言うと、Form1 の側でコードを書く場合
Me は、自分自身、つまり Form1 を意味します。・・・なのですが、もしこれが
Form2 の側でコードを書いているとしたら、Me は Form2 を意味することになります。

#この辺は大丈夫ですか?
#もし分からなかったら「どこら辺が分からないか」を質問してください

ここは「分かったよ!」ということにして次に進みますが

じゃあ、Form1 側のコードから、Form2 の側を操作する場合には、一体どうすれば良いのでしょうか、
何かアイデアは浮かびますか?想像も付きませんか?
実は(’▽’)ノシ さんは、すでに(気付かぬ内に?)そんなスゴイ(!)ことやちゃってるんです。

> f2.Label1.Text = "文字" 
というコードがそうです。

いよいよ本番!


このコードは Form1 の側に書いてますから、これをうっかり
> Me.Label1.Text = "文字"
と書いてしまえば、Form1 のラベルが書き換わってしまいます。

そこで、るきお先生 の書いたコードを、もう一度見直してみると
> Public Class Form1
>     Dim f2 As Form2
>     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
>         f2 = New Form2
>         f2.Show()
>     End Sub
>     Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
>         f2.Label1.Text = "文字"
>     End Sub
> End Class

最初の方で
> Dim f2 As Form2

とあります。これは 
「f2 ってのは Form2 のことだからね、宜しくね!」と VB に教えている部分です。なので
> f2.Label1.Text = "文字" 
と記述すると、VBは
「あ、f2 というのは Form2 のことだよね!」と、その意味をきちんと理解して
(Form1に書いたコードなのに) Form2 側のラベルを書き換えてくれてたんですね。


・・・だとしたら、この f2 を上手く利用して、
#もちろん VBに、f2は「 Form2 のことだよ!」と教えてなきゃダメですが
たとえば ↓のような Form1 の側に書いたコードを上手に書き換えて

> Me.BackColor = Color.Red
> Me.BackgroundImage = Image.FromFile("C:\Windows\大草原の風.bmp")

望み通りに Form2 側の、背景色や、背景画像を変更させちゃうような
何か上手いアイデアは思い浮かびませんか?少しも想像が付きません?

#もし良く分からない所があったら「ココが分からない」と質問してくださいね


何だかクイズ(笑)みたいになっちゃいましたけど、
VBからの挑戦状!(?)みたいな感覚で、謎解きに挑戦してみてください。
#解けそうで解けない感じですか?もうチョッとで何かひらめきそうですか?

何はともあれ、最後まで読んで下さいまして有難うございます。

ここまで長々と読み続けて頂いたご苦労に比べれば、こんな VBの挑戦状なんて
雑作も無いことかもしれません。ただ何処か一ヶ所でも引っかかっていたりすると、
なかなか視界が開けて来なかったりするんですよね。
#ほんのチョッとしたひらめきで一気にパーッと視界が開けることもありますよ

最後にもう一度、お終いまで読んでくれて本当にありがとう!
投稿者 m190  (社会人) 投稿日時 2012/6/16 07:22:43
 d(^^;<なまえ書くの忘れちゃいました
投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/16 09:12:38
m190さんどうもありがとうございました。
できました!
とってもわかりやすかったです!




投稿者 zz6989  (社会人) 投稿日時 2012/6/16 09:25:50
(’▽’)ノシ さんこんにちは、m190 さんの回答で殆ど解決できたと思いますが、(m190 さんのご意見は考える元気がでますよね)最後の質問なんですけど。 
> また、Form1のボタンを押すとForm2の背景が変わるというのはどうやってやるんでしょうか・
すいません、この質問の意味が少々わかりませんでしたので、逆質問させてください。
Form1のコード
Public Class Form1
    Dim Picture As New ArrayList '画像ファイルのコレクション 
    Dim f As New Form2
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Picture.Add("C:\xxxx"'画像ファイル名を入力してください。 
        Picture.Add("C:\xxxx"'別の画像ファイル名を入力してください。 
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        'クラスにボタンをクリックした時の数をカウントする 
        f.butn += 1

        f.Owner = Me

        AddHandler Button1.Click, AddressOf Form2_show
    End Sub
    Private Sub Form2_show(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
        Dim i As Integer
        i = f.butn

        Dim ip As Integer
        If i Mod 2 = 0 Then  'ボタンを押した時の数を2で割ったときの余りが0の時 
            ip = 0
        Else                 'それ以外の時 
            ip = 1
        End If

        Form2.PictureBox1.Image = Image.FromFile(Picture(ip))
        Form2.Label1.Text = "文字"

        Form2.Show()

    End Sub

End Class


 Form2側
Public Class Form2
    Shared _butn As Integer
    'ボタンをクリックした時の数 
    Public Property butn() As Integer
        Get
            Return _butn
        End Get
        Set(value As Integer)
            _butn = value
        End Set
    End Property
End Class
できればコードを、コピペしてForm1の画像ファイルを2箇所入力して 動作の確認をしてみてください。ボタンを押すたびに画面が切り替わります。今は詳しい内容の説明はしません。
質問された内容を確認したいためです。
頭をひねっている最中申し訳ありません。宜しくお願いします。

投稿者 (’▽’)ノシ  (社会人) 投稿日時 2012/6/16 10:04:43
zz6989さんこんにちは!
画像が切り替わりました!!

これはどういうときに使えますか?
投稿者 zz6989  (社会人) 投稿日時 2012/6/16 11:39:47
(’▽’)ノシ  さんへ
先ほどは、時間切れで慌てて書いてしまいましたので、追記します。
コードは、m190さんや、るきお先生、魔界の仮面弁士さまが書いてくださったものとは違いますので、混乱を避けるため、動作の確認ができましたら消し去ってください。
あくまでも質問の意味を確認するために書きました。

>また、Form1のボタンを押すとForm2の背景が変わるというのはどうやってやるんでしょうか・
の質問とは違ったようですね。
違うというのも、一つのヒントです。
できれば上記の質問と今回の動作がどのように違うのか、可能な範囲で結構ですので返信していただければうれしいのですが。
他の人が回答しやすくなりますね。

>これはどういうときに使えますか? 
そうゆうときに使います。


るきお先生
ひとりひとりに親切に教えてくれる、みんながあこがれる高校の先生。

魔界の仮面弁士さま
東京大学の大学院を卒業した、とんでもない人、かげでは、とてつもない研究をしている小学校の先生。

m190 さん
心療内科の先生、但し大学の医学部を卒業しているため、有能でそれなりの知識を持っている。

zz6989 
何回教わっても覚えない劣等生。

(’▽’)ノシ   
一生懸命頑張ってる、将来有望な青年。
投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/16 13:21:38
zz6989さんへ

時間切れってなんですか!?掲示板って時間制限があったりしますか?

あと、ちょっと失礼ですが・・・、
そういうときとはどういうときですか・・?
投稿者 zz6989  (社会人) 投稿日時 2012/6/16 14:13:58
>時間切れってなんですか!?
すいません、言葉不足でした。
私自信が私用で、出かけなければなりませんでした。

>そういうときとはどういうときですか・・?
トイレに行きたいとか、おなかがすいたとか。 







投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/16 14:27:52
そうだったんですかw

そうゆうことじゃなくて、
画像が切り替わるのがどういう時につかえるかです(A^^;)
投稿者 zz6989  (社会人) 投稿日時 2012/6/16 20:23:53
>そうゆうことじゃなくて、
あっ違いましたか、失礼しました。

ここからは、マジメな話です。
(’▽’)ノシ さんが質問された意味を私が汲み取ることが出来ませんでしたので、サンプルコードを実行してもらって、「この動きは目的の動きと違うよ」とか返信してもらえれば、消去法で質問の意味を理解できると思いましてコードを書いただけですので、何か他に使える可能性はありません。

しかも(’▽’)ノシ さんが、ご自信で解決されていたのを気がつかず、投稿してしまいました。解決の投稿が、ほんの少しの時間差だったんですよね。
混乱させてしまったようです。すいませんでした。

投稿者 (’▽’)ノシ  (中学生) 投稿日時 2012/6/18 16:51:06
zz6989さん
返事おくれてすみません。

そうだったんですか
こちらもすいませんでした