ここから本文です

C#.NET Windowsフォームアプリケーション 重複するPicureBoxの透過方法 VSC2015

hyu********さん

2016/3/3112:05:23

C#.NET Windowsフォームアプリケーション 重複するPicureBoxの透過方法 VSC2015

Visual Studio Community 2015、Windows7 Ultimate 64bitにてWindowsフォームアプリケーションを作成中です。

(他のコントロールでも同様ですが、ここではPictureBoxに限定します。)
PictureBoxは透過色を設定することで親コントロールの色に従って背景色を透過することが出来ますが、複数のPicutureBoxが重なる場合、後ろにあるPictureBoxが、手前にあるPictureBoxの透過部分によって色が上書きされ、本来のコントロールの形が見えてしまいます。
動作としては当然なので良いのですが、
「コントロールが重複した部分のみ背後に存在するコントロールの色に合わせて透過する方法」
、もしくは擬似的にでもそれを行う方法は無いでしょうか。
目的を果たせる手法があれば教えて頂きたいです。案だけでも構いません。
----------------------------------
添付画像はそのイメージです。
■左側のフォーム
青く塗られたフォーム上に、四角いPictureBoxが2つ重なるように配置しています。
一方は赤く円を描画し、他方は黄色い円を描画しています。
赤い円が描かれたPictureBoxが手前に配置されています。
いずれも、親コントロールをフォームに設定しているため、円の外側の領域が青く塗られています。(透過)
しかし、重なっている部分は手前のPictureBoxの透過色が優先されるため、せっかく透過しても黄色い円が削られてしまいます。
■右側のフォーム
理想としては、重複した部分に関しては1つ後ろのコントロールの色に合わせた透過がされるようにしたいのです。(この画像はペイントで青い部分を塗りつぶして作成しました。)
------------------------------
以下、添付画像のプログラムです。
(デザイナ側でフォームにpictureBox1とpictureBox2を適当に配置しておきます。)
/* ここから */
using System;
using System.Drawing;
using System.Windows.Forms;

namespace multiPB
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

Size = new Size(200, 150);

//わかりやすさのためにフォーム背景を青に塗る
BackColor = Color.Blue;

//2つのPictureBoxが1/4だけ重なるように配置。
pictureBox1.Size = new Size(50, 50);
pictureBox2.Size = new Size(50, 50);
pictureBox1.Location = new Point(0, 0);
pictureBox2.Location = new Point(25, 25);

//PictureBoxの背景が透過されるように設定
pictureBox1.BackColor = Color.Transparent;
pictureBox2.BackColor = Color.Transparent;

//親をフォームに設定
pictureBox1.Parent = this;
pictureBox2.Parent = this;

//とりあえずpictureBox1を手前に持ってくる
pictureBox1.BringToFront();
}

//PictureBoxに表示するイメージ
Bitmap bmp1, bmp2;

private void Form1_Load(object sender, EventArgs e)
{
//PictureBox1の中に赤い円を描く。
bmp1 = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp1))
g.FillEllipse(Brushes.Red, pictureBox1.ClientRectangle);
pictureBox1.Image = bmp1;

//PictureBox2の中に黄色い円を描く。
bmp2 = new Bitmap(pictureBox2.Width, pictureBox2.Height);
using (Graphics g = Graphics.FromImage(bmp2))
g.FillEllipse(Brushes.Yellow, pictureBox2.ClientRectangle);
pictureBox2.Image = bmp2;
}
}
}
/*ここまで*/

宜しくお願い致します。

PictureBox1,PictureBox2,g.FillEllipse,bmp2,New Bitmap,new Region,gp.CloseFigure

閲覧数:
227
回答数:
1

違反報告

ベストアンサーに選ばれた回答

red********さん

2016/4/122:37:44

Regionを使えば出来るようですよ

FomのLoadイベントにて

pictureBox1.BackColor = Color.Red;
pictureBox2.BackColor = Color.Yellow;

System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
gp.AddEllipse(pictureBox1,ClientRectangle);
gp.CloseFigure();

pictureBox1.Region = new Region(gp);
pictureBox2.Region = new Region(gp);

といった具合です

この回答は投票によってベストアンサーに選ばれました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる