トップ回答者
Pictureboxを重ねる

質問
回答
-
ハジ さん、こんにちは
ダッチです。
Color.Transparent は親コントロールを表示すると思った方がいいと思います。
PictureBox の親コントロールはフォームになっているのではないでしょうか?
その場合は PictureBox 同士が重なった時に透明になっている部分には、フォームが表示されているはずです。ではどうするかというと PictureBox 自体の形を変えてやります。
PictureBox の Region プロパティを 凸 の形にすれば期待通りの表示が出来ると思います。
PictureBox を三角形にするサンプルDim p As New System.Drawing.Drawing2D.GraphicsPath
p.StartFigure()
p.AddLines(New Point() {New Point(0, 0), New Point(100, 0), New Point(0, 100)})
p.CloseFigure()
Me.PictureBox1.Region = New Region(p)そのほかの方法としては、一つひとつのピース(?)を PictureBox で表現するのではなく、直接描画してしまったほうがいいと思います。これが一番のお勧めです。PictureBox の数が多くなってくるとリソースを多く消費し、描画が重くなってくるかもしれません。
-
ハジ さんからの引用 Regionの使い方を教えてください
Region の使い方というよりは GraphicsPath を使用して Region を作成するのが簡単ですので GraphicsPath の使い方になります。一応 GraphicsPath を使用して三角形を作成するサンプルを記載しましたが、わかりませんでしたか?
AddLines メソッドでは指定した座標をたどるように線をまとめて引いていきます。
CloseFigure メソッドを呼ぶと最初の座標から最後の座標に線を引きます。
これで図形が出来るイメージがわきますか?いろいろと AddLines メソッドに座標を渡してみてどう変化するのかを確認できれば、イメージがわきやすいかと思います。
例えば、次の四点の座標を結ぶ図形はどうなるかイメージがわきますか?
(0, 0) - (10, 0) - (10, 10) - (0, 10)
これは一辺が 10 ピクセルの四角形ができます。それと特に AddLines メソッドにこだわる必要はありません。
AddLine メソッドを使用すれば一本一本線を引いていきます。
AddArc メソッドを使用すれば丸みを帯びた図形も作成することができます。テトリスであれば丸みを帯びる必要はないと思いますので、AddLines メソッドや AddLine メソッドだけで十分だと思いますよ。
手元に方眼紙などがあれば実際に線を引いてみて角の座標がどうなっているかを確認しやすいと思います。
実際にこういう図形が作りたくてこういうコードを書きましたが形が変になってしまいます、というのがあればそれを提示してもらえれば指摘できると思います。
-
回転した感じになってますが、出来ています。
イメージしやすいようにこんなのを作ってみました。
__|この形を作るには、左上の座標 (0, 10) を始点として右方向に線を引いていくとこのようになります。
Code Snippetp.AddLines(New Point() {New Point(0, 10), New Point(20, 10), New Point(20, 0), New Point(30, 0), New Point(30, 20), New Point(0, 20), New Point(0, 10)})最後の New Point(0, 10) は無くてもかまいません。
-
話をぶっちぎってすみませんが、
私の方法は以下のようになります。念のため。
Code SnippetMe.PictureBox1.Image = Image.FromFile("C:\test.jpg")
Dim bmp As New Bitmap(200, 200, Imaging.PixelFormat.Format32bppArgb)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillEllipse(Brushes.Red, New Rectangle(0, 0, 200, 200))
g.Dispose()Me.PictureBox2.Parent = Me.PictureBox1
Me.PictureBox2.Left = 0
Me.PictureBox2.Top = 0
Me.PictureBox2.Image = bmp
Me.PictureBox2.BackColor = Color.Transparent -
ハジ さんからの引用 一つ気になったんですけど、この x と y は、Formのサイズで数えるんですか?? それともPictureboxのサイズで数えるんですか??
PictureBox のサイズになります。
図では 10 や 20 という値になっていますが、ハジさんが最適だと思う大きさにすればいいですよ。
それと GraphicsPath を Region にしていますが、GraphicsPath を描画することもできますので、落ち着いてきたら描画する方法も試してみてください。いろいろやれることが増えてくるとプログラミングが楽しくなってきます。
すべての返信
-
ハジ さん、こんにちは
ダッチです。
Color.Transparent は親コントロールを表示すると思った方がいいと思います。
PictureBox の親コントロールはフォームになっているのではないでしょうか?
その場合は PictureBox 同士が重なった時に透明になっている部分には、フォームが表示されているはずです。ではどうするかというと PictureBox 自体の形を変えてやります。
PictureBox の Region プロパティを 凸 の形にすれば期待通りの表示が出来ると思います。
PictureBox を三角形にするサンプルDim p As New System.Drawing.Drawing2D.GraphicsPath
p.StartFigure()
p.AddLines(New Point() {New Point(0, 0), New Point(100, 0), New Point(0, 100)})
p.CloseFigure()
Me.PictureBox1.Region = New Region(p)そのほかの方法としては、一つひとつのピース(?)を PictureBox で表現するのではなく、直接描画してしまったほうがいいと思います。これが一番のお勧めです。PictureBox の数が多くなってくるとリソースを多く消費し、描画が重くなってくるかもしれません。
-
ハジ さんからの引用 Regionの使い方を教えてください
Region の使い方というよりは GraphicsPath を使用して Region を作成するのが簡単ですので GraphicsPath の使い方になります。一応 GraphicsPath を使用して三角形を作成するサンプルを記載しましたが、わかりませんでしたか?
AddLines メソッドでは指定した座標をたどるように線をまとめて引いていきます。
CloseFigure メソッドを呼ぶと最初の座標から最後の座標に線を引きます。
これで図形が出来るイメージがわきますか?いろいろと AddLines メソッドに座標を渡してみてどう変化するのかを確認できれば、イメージがわきやすいかと思います。
例えば、次の四点の座標を結ぶ図形はどうなるかイメージがわきますか?
(0, 0) - (10, 0) - (10, 10) - (0, 10)
これは一辺が 10 ピクセルの四角形ができます。それと特に AddLines メソッドにこだわる必要はありません。
AddLine メソッドを使用すれば一本一本線を引いていきます。
AddArc メソッドを使用すれば丸みを帯びた図形も作成することができます。テトリスであれば丸みを帯びる必要はないと思いますので、AddLines メソッドや AddLine メソッドだけで十分だと思いますよ。
手元に方眼紙などがあれば実際に線を引いてみて角の座標がどうなっているかを確認しやすいと思います。
実際にこういう図形が作りたくてこういうコードを書きましたが形が変になってしまいます、というのがあればそれを提示してもらえれば指摘できると思います。
-
回転した感じになってますが、出来ています。
イメージしやすいようにこんなのを作ってみました。
__|この形を作るには、左上の座標 (0, 10) を始点として右方向に線を引いていくとこのようになります。
Code Snippetp.AddLines(New Point() {New Point(0, 10), New Point(20, 10), New Point(20, 0), New Point(30, 0), New Point(30, 20), New Point(0, 20), New Point(0, 10)})最後の New Point(0, 10) は無くてもかまいません。
-
話をぶっちぎってすみませんが、
私の方法は以下のようになります。念のため。
Code SnippetMe.PictureBox1.Image = Image.FromFile("C:\test.jpg")
Dim bmp As New Bitmap(200, 200, Imaging.PixelFormat.Format32bppArgb)
Dim g As Graphics = Graphics.FromImage(bmp)
g.FillEllipse(Brushes.Red, New Rectangle(0, 0, 200, 200))
g.Dispose()Me.PictureBox2.Parent = Me.PictureBox1
Me.PictureBox2.Left = 0
Me.PictureBox2.Top = 0
Me.PictureBox2.Image = bmp
Me.PictureBox2.BackColor = Color.Transparent -
ハジ さんからの引用 一つ気になったんですけど、この x と y は、Formのサイズで数えるんですか?? それともPictureboxのサイズで数えるんですか??
PictureBox のサイズになります。
図では 10 や 20 という値になっていますが、ハジさんが最適だと思う大きさにすればいいですよ。
それと GraphicsPath を Region にしていますが、GraphicsPath を描画することもできますので、落ち着いてきたら描画する方法も試してみてください。いろいろやれることが増えてくるとプログラミングが楽しくなってきます。