質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

5886閲覧

PictureBoxを2つ重ねて表示したい

hanbee.com

総合スコア52

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/09/22 07:48

編集2020/09/26 05:46

前提・実現したいこと

基本的なことかもしれないのですが、どれだけ調べてもうまく行かないので
質問させていただきます。
仮にA, BというPictureBoxがあったとして
AのPictureBoxを背景として使って(棚の写真を使おうとしています)
BのPictureBoxをその上に重ねて表示したい(棚の中にある本やモノ)
と思っています。

発生している問題・エラーメッセージ

エラーメッセージがあるわけではなく、背景であるAのPictureBoxは表示されるが、BのPictureBoxをその上に表示しようとすると、灰色一色になる。
そもそもAのPictureBoxの上ではなく別の場所に表示させても表示されないので、別の問題かもしれませんが、表示されないこと自体よくわからないので、質問させていただきます。

該当のソースコード

VB

1 'pb_tanaに棚の写真を背景として表示 2 Private Sub pb_tana_Paint(sender As Object, e As PaintEventArgs) Handles pb_tana.Paint 3 pb_tana.SizeMode = PictureBoxSizeMode.Zoom 4 pb_tana.Image = System.Drawing.Image.FromFile("C:\1.jpg") 5 End Sub 6 7 '棚の上のpb_a1に本を表示 8 Private Sub pb_a1_Paint(sender As Object, e As PaintEventArgs) Handles pb_a1.Paint 9 pb_a1.SizeMode = PictureBoxSizeMode.Zoom 10 pb_a1.Image = System.Drawing.Image.FromFile("C:\2.jpg") 11 End Sub

試したこと

pb_a1のParentプロパティはpb_tanaにしています。
またpb_a1のback_colorプロパティはtransparentにしています。

補足情報(FW/ツールのバージョンなど)

プロジェクトの種類:WindowsFormApplication
フレームワーク:.NET Framework 4.7.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/23 16:28 編集

プロジェクトの種類(WPFか、WindowsFormsか)と、.NET Frameworkや.NET Coreのバージョン含めて補足情報に追加してください。ソースコードはインデントが崩れて読み辛くなるので、コードの挿入で記入してください。
hanbee.com

2020/09/26 05:46

見直しを行いました。
guest

回答2

0

まずPictureBoxのImageプロパティに画像をセットするのであればPaintイベントにて行うのは間違いです。
フォームのイニシャライズ時などの初期化時に行うべきです。
Paintイベントで行うと、再描画が必要になる度に実行されるので適切ではありません。

また「pb_a1のback_colorプロパティはtransparentにしています。」とのことですが
backcolorプロパティとは「コントロールの背景色」のことです。
Imageプロパティに画像が設定されていると、そのコントロールの背景色の上に設定した画像が描画されます。
ようは「コントロールの背景色」と「画像の背景色」は全く別のものとなります。
このあたりを勘違いされているのではないでしょうか?
このことより、コントロールの背景色を透明にしたとしても、画像の背景色が透明ではないので、重ね合わせたときは背景は透過されません。
jpegは透過対応していないので、透過対応している画像ファイルを設定すれば背景色は透過します。

背景画像
イメージ説明
玉1(JPEGファイル)
イメージ説明
玉2(背景透過したPNGファイル)
イメージ説明
を用意し

VBNET

1Public Class Form1 2 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 3 Dim backPic As New PictureBox With {.Location = New Point(0, 0), 4 .Size = New Size(200, 200), 5 .Image = Image.FromFile("d:\test\tana.jpg"), 6 .SizeMode = PictureBoxSizeMode.Zoom} 7 8 Dim tamaPic1 As New PictureBox With {.Name = "tama1", 9 .Location = New Point(10, 10), 10 .Size = New Size(40, 40), 11 .BackColor = Color.Transparent, 12 .Image = Image.FromFile("d:\test\tama.jpg"), 13 .SizeMode = PictureBoxSizeMode.Zoom} 14 15 Dim tamaPic2 As New PictureBox With {.Name = "tama2", 16 .Location = New Point(50, 50), 17 .Size = New Size(40, 40), 18 .BackColor = Color.Transparent, 19 .Image = Image.FromFile("d:\test\tama2.png"), 20 .SizeMode = PictureBoxSizeMode.Zoom} 21 22 Me.Controls.Add(backPic) 23 backPic.Controls.Add(tamaPic1) 24 backPic.Controls.Add(tamaPic2) 25 26 AddHandler tamaPic1.Click, AddressOf pic_Click 27 AddHandler tamaPic2.Click, AddressOf pic_Click 28 29 30 End Sub 31 32 Private Sub pic_Click(sender As Object, e As EventArgs) 33 Debug.Print(sender.name) 34 End Sub 35 36End Class 37

上記ソースを実行した結果がこちらです。
イメージ説明

クリックイベントも設定してありますので、玉をクリックするとクリックしたPictureBoxの名前がデバッグ出力されます。
この方法の場合、PictureBoxのクリックイベントなので背景部分をクリックしても反応します。

投稿2020/09/26 02:55

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanbee.com

2020/09/26 05:56

JPGとPNGとでは透過性が異なるんですね。勉強になりました。ありがとうございます。 背景色に対する理解が間違っていたようですね 実際、ピクチャーボックスの上にピクチャーボックスを重ねるのはやめましたが、ラベルを重ねるつもりなので、参考にさせていただこうと思っています。
guest

0

ベストアンサー

PictureBoxと書いてあるので、恐らくWindowsFormsプロジェクトと推測しますが、まず前提として、WindowsFormsのコントロールは透明・半透明にして重ねて使う事を考慮されていません。
(小細工したらそれっぽい表示は出来なくもないですが、破綻しやすいので全くオススメしません)

ちなみに、WPFのImageの場合は、特に何も考えずとも透過を考慮して重ね合わせを行ってくれるので、画像の重ね合わせ的な事をしたいのであれば、正直WPFをオススメします。
下記画像は、WPFプロジェクトのデザイナー画面で画像を読み込んで重ね合わせたものです。

WPF

前提を踏まえた上で、どうしても実現したい事をWindowsFormsのPictureBoxでやるのであれば、あらかじめ重ね合わせた画像を作成し、それをPictureBoxに設定する感じになると思います。
下記コードは、フォーム起動時に本棚と本の画像を重ね合わせて表示させた例です。

vbnet

1Public Class Form1 2 3 Protected Overrides Sub OnLoad(e As EventArgs) 4 MyBase.OnLoad(e) 5 6 7 '画像読み込み 8 Dim bmpTana = DirectCast(Image.FromFile("c:/test/tana_empty.png"), Bitmap) '本棚画像 9 Dim bmpBook = DirectCast(Image.FromFile("c:/test/book_tosyokan_label_green.png"), Bitmap) '本画像 10 11 '本棚画像の上に本画像を描画 12 Using graphic = Graphics.FromImage(bmpTana) 13 graphic.DrawImage(bmpBook, 0, 0) 14 End Using 15 16 '本を描きこんだ本棚画像をPictureBoxに設定 17 '(PictureBox.Imageに既に画像が設定されていたら解放) 18 Dim oldImage = PictureBox1.Image 19 PictureBox1.Image = bmpTana 20 If oldImage IsNot Nothing Then 21 oldImage.Dispose() 22 End If 23 24 '本画像を解放(本棚画像はPictureBox内で使用中なので解放してはいけない) 25 bmpBook.Dispose() 26 27 End Sub 28 29End Class 30

(実行例)
WindowsForms

投稿2020/09/22 10:20

編集2020/09/22 10:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanbee.com

2020/09/23 10:35

radian様 追記依頼とご丁寧な回答まで頂いているのに、返信が大変遅れて申し訳ありません。 ご推測の通り、私が使っているのはWindowsFormApplicationの方です。 こっちの方はコントロールを重ねて使用することはできないんですね。初めて知りました。 ありがとうございます。 PictureBoxの上にPictureBox、またさらにLabelやパネルなど始めからコントロールを重ねて使うつもり 満々だったので、おすすめいただいたWPFというものの使用を考えたいと思います。 ちなみになのですが、初心者なもので、WindowsFormApplicationの使い方しか知りませんし、あまり 時間にも余裕がありません。 WPFのことを軽く調べてみましたが、ひとつ確認したいことがあります。 WPFはこれまで作ってきたWindowsFormApplicationでのコードをそのまま使うことはできますか? または、簡単な改造で適応できますでしょうか? お手数おかけしますが、ご回答よろしくお願いいたします。
hanbee.com

2020/09/23 10:45

WPFでは時間がかかるようであれば、無理にでもWindowsFormApplicationを使ってやっていきたいと思います。 本棚が背景にあってほしいというのはあるのですが、表題のようにPictureBoxを重ねることでそれを再現するのではなく、別の方法で再現できるのであればそうしたいと思っています。(例えばCreateGraphicsを使って、本棚を描くというような。でもGraphics自体がPictureBoxのコントロールを使っているだろうし、これは無理っぽいかもしれませんね。。。) 質問ばかりで恐れ多いですが、もしよろしければ他の方法もご提案いただけたら何よりです。。
退会済みユーザー

退会済みユーザー

2020/09/23 11:00 編集

> WPFのことを軽く調べてみましたが、ひとつ確認したいことがあります。 WPFはこれまで作ってきたWindowsFormApplicationでのコードをそのまま使うことはできますか? または、簡単な改造で適応できますでしょうか? まずデザイナーがXamlベースでWindowsFormsと異なりますし、コントロールの種類も違いますので画面側はほぼ作り直しに近くなると思います。 > 本棚が背景にあってほしいというのはあるのですが、表題のようにPictureBoxを重ねることでそれを再現するのではなく、別の方法で再現できるのであればそうしたいと思っています。(例えばCreateGraphicsを使って、本棚を描くというような。でもGraphics自体がPictureBoxのコントロールを使っているだろうし、これは無理っぽいかもしれませんね。。。) サンプルコードは読んで頂いてますか?
hanbee.com

2020/09/23 11:03

なるほど。ありがとうございます。 サンプルコードがまさにそれなんですね。ご配慮ありがとうございます。 ちなみに最後に質問させていただきたいのですが。 PictureBoxの上にパネルをのせて、そのパネルの上にPictureBoxやテキストボックスなどのコントロールをのせることは可能でしょうか。 これが今自分に思いつく最後の方法です。 これができないということならば、黙ってradianさんに頂いたサンプルコードを使って頑張ってみたいと思います。 ご回答よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2020/09/23 11:19 編集

回答に載せている通り、コントロールの上にコントロールを載せる事は出来ますが、WindowsFormsではコントロール同士の透過は出来ないものと考えてください。 フォームを透過させる事は可能ですが、こちらも割と面倒なので覚悟が必要です。 https://www.ipentec.com/document/csharp-winform-layerd-window-create
hanbee.com

2020/09/23 13:10

radianさんにはwindowsformsでのあらかじめ重ね合わせた画像をPictureboxに設定する方法を教えていただきました。失礼ながらまだ腑に落ちていないのです。 しつこいようですが、例えば本棚と本のbitmapを重ね合わせた画像をPictureboxに設定したとして、 その本の上にパネルをのせてボタンなりラベルなりを配置することはできるのでしょうか。(本を選択対象のオブジェクトとしたい)
退会済みユーザー

退会済みユーザー

2020/09/24 00:26 編集

修正依頼に書いた点の質問文の編集をお願いします。 > 本棚と本のbitmapを重ね合わせた画像をPictureboxに設定したとして、 > その本の上にパネルをのせてボタンなりラベルなりを配置することはできるのでしょうか。 > (本を選択対象のオブジェクトとしたい) 繰り返しますが、載せる事はできます。(見栄えはともかくとして) Regionでコントロール自体の形を変えることが出来るので、頑張ればこれでいけるかもしれません。 [フォームやコントロールの形を変える] https://dobon.net/vb/dotnet/form/formregion.html
hanbee.com

2020/09/26 05:44

すみませんが、コントロールの上にコントロールを重ねるのは諦めます。 コントロールの形を変えるのは使えるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問