コントロール同士のの透過について

タグの編集
投稿者 A  (社会人) 投稿日時 2011/11/23 09:03:17
ボウリングゲーム作りに取り組んでいますが、どうしてもわからないことがでてきたので
おしえください。
PictureBoxを使ってピンを並べてみたのですが

PictureBox同士を部分的に重ねたときに後背面にあるPictureBoxの画像が欠けてしまいます。
前面にあるピンの余白部分を透過して後背面にあるピンを表示することは可能なのでしょうか?
よろしくお願いします 

開発環境VS 2010  言語VB2010

投稿者 るきお  (社会人) 投稿日時 2011/11/23 11:25:14
不可能です。

画像を重ねて表示し、前の画像の背景を透過させたい場合はPictureBoxを2つ使うのではなく、1つのPictureBoxを使ってDrawImageします。

具体例はここで紹介しているので参考にしてください。
http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample140ImageTransparent.htm

投稿者 陸羽  (社会人) 投稿日時 2011/11/23 13:17:35
paintイベントハンドラのコードをだせますか?(質問者さん)

とゆうのは、ボクは入門本を6冊持ってますけど、全部、クリエートグラフィックスの処理で掲載されてます。
イベントハンドラ内のサンプルは、ルキオ先生のサイトとか、ヘルプでしかゲットできません。
ヘルプはvisualbasicで、ヘルプをクリックしてグラフィックスで検索すれば、でます。

ヘルプ自体をインストールしておく必要があります。
インストールしてないと見れません。

ヘルプはマイクロソフト直轄ですから、キチント理解すれば、できますよ。
投稿者 陸羽  (社会人) 投稿日時 2011/11/23 13:26:50
Private Sub Form1_Paint(ByVal sender As ObjectByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

       ' Dim g As Graphics = e.Graphics 
       ' g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias 
       ' b.hyouji(g, 150, 150) 

    End Sub


こんな感じのプログラム。
オリジナルクラスが入ってるんで、動きませんので。コメントつけました。
投稿者 ぺぺたろう  (中学生) 投稿日時 2011/11/23 18:35:18
>ヘルプ自体をインストールしておく必要があります。
インストールされてない場合はブラウザでMSDNが開かれるのでは?
投稿者 A  (社会人) 投稿日時 2011/11/23 19:10:28
>具体例はここで紹介しているので参考にしてください。
>http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample140ImageTransparent.htm
ありがとうございました。
ただ、もう一点よろしいでしょうか?
もし、PictureBoxを10個並べて、PictureBoxの3と4、5と6、7と8、9と10
をそれぞれ透過処理したい場合には、(上記のサンプルを参考にすれば)
その数だけ同じようなコードを書く必要があるという解釈でよいのですか

それとももっと効率的な書き方があるのでしょうか?

投稿者 shu  (社会人) 投稿日時 2011/11/24 10:28:45
> 不可能です。
>
>画像を重ねて表示し、前の画像の背景を透過させたい場合はPictureBoxを2つ使うのではなく、1つ>のPictureBoxを使ってDrawImageします。

とるきおさんは言っています。

なので
> もし、PictureBoxを10個並べて、PictureBoxの3と4、5と6、7と8、9と10
>をそれぞれ透過処理したい場合には
が出来るとは言っていません。

提示されたページの内容をよく読むとPictureBox1とPictureBox2を透過処理しているのではなくて
PictureBox1のイメージの上にPictureBox2のイメージを透過して描画しているだけであることが分かると思います。
投稿者 A  (社会人) 投稿日時 2011/11/24 19:01:03
表現の仕方を間違えました。
PictureBox1のイメージの上にPictureBox3と4、5と6、7と8、9と10
のイメージを透過して描画することはできるのでしょうか。 

 
 




投稿者 shu  (社会人) 投稿日時 2011/11/25 07:32:21
>PictureBox1のイメージの上にPictureBox3と4、5と6、7と8、9と10
のイメージを透過して描画することはできるのでしょうか。 

順番に処理していけば可能です。ただ透過描画するImageは特にPictureBoxに
張り付いていなければいけないものではありません。またボーリングのピンが10本だからと
いっておなじ画像を10枚用意する必要はありません。同じものを透過でどんどん描画して
いけばよいかと思います。
投稿者 A  (社会人) 投稿日時 2011/11/26 13:24:21
>ただ透過描画するImageは特にPictureBoxに
>張り付いていなければいけないものではありません。
というのは?

>またボーリングのピンが10本だからと
>いっておなじ画像を10枚用意する必要はありません。同じものを透過でどんどん描画して
>いけばよいかと思います。 

どのようなコードを書いてよいのか皆目見当がつきません
すみません
投稿者 shu  (社会人) 投稿日時 2011/11/26 14:00:31
> というのは?
たとえばBitmapクラスはImageから派生したクラスで
DrawImageに使用できますが、
Bitmapクラスのインスタンスはnewで作ることも出来れば
Bitmap.FromFile、Bitmap.FromStream
などのメソッドによる読み込みも可能です。

またコード上に書かない方法として、リソースとして画像を登録すれば
それもまたImageクラスのインスタンスとして使用出来ます。

つまり表示する画像を置いて置く場所としてPictureBoxを非表示にしてわざわざ
フォームに貼り付けておく必要はないということです。


> どのようなコードを書いてよいのか皆目見当がつきません

るきおさんが提示されたサンプル内の
SourceImage As Image = PictureBox2.Image
この部分が例えばボーリングのピンだとして
ボーリングのピンは全部同じ形なのだからSourceImageを座標を変えて
DrawImageするだけでいいのです。
(違っていたらそれぞれ用意しなければなりませんが)