日期:2014-05-18  浏览次数:21612 次

C#关于两个pictureBox叠加透明的问题
各位大神求帮助啊!
现在又两个pictureBox,一个是和Form 空间一样大的,然后我用来做为动态的背景。另一个是pictureBox2也是一张图片,但是我将这个pictureBox2的背景设置为透明,将加载的图片用MakeTransparent弄成透明,但是在调试的时候,pictureBox2在1上面还是现实有矩形的白色底,这是为什么啊??有什么方法可以弄成透明的??

------解决方案--------------------
C# code
在控件的代码编辑器中找到构造函数。
在构造函数中调用窗体的 SetStyle。
' Visual BasicSetStyle(ControlStyles.SupportsTransparentBackColor,True)
// C#SetStyle(ControlStyles.SupportsTransparentBackColor,true);这将使控件能够支持透明背景色。

在步骤 1中添加的代码行下再添加下面的代码行。这将把控件的 BackColor 设置为 Transparent。
' Visual BasicMe.BackColor = Color.Transparent
// C#this.BackColor = Color.Transparent;注意,还可以通过使用Color.FromArgb方法创建半透明颜色。有关颜色的更多信息,请参见笔、画笔和颜色。

------解决方案--------------------
///// <summary>
///// 叠加PNG图片透明
///// </summary>
///// <param name="pic">需要透明的图片、保证图片上没有白色区域</param>
///// <param name="picBack">叠加下面的图片</param>
//private void Transparent(PictureBox pic, PictureBox picBack)
//{
// pic.Visible = false;

// // 生成一个与PictureBox一样大的缓冲区
// Bitmap buffer = new Bitmap(pic.Width, pic.Height);

// // 创建图形对象,绘图区域为刚刚生成的缓冲区
// Graphics g = Graphics.FromImage(buffer);

// // 背景上被PictureBox覆盖的区域区域。假定PictureBox覆盖在背景图之上
// Rectangle scrRect = new Rectangle(
// pic.Left - picBack.Left, // 截图区域的左上角X坐标
// pic.Top - picBack.Top, // 截图区域的左上角Y坐标
// pic.Width, // 截图区域的宽度
// pic.Height); // 截图区域的高度

// // 将背景上被PictureBox覆盖的那块区域截图下来,保存在缓冲区中
// g.DrawImage(picBack.Image, // 背景图
// 0, // 所截图片画在缓冲区中的左上角X坐标
// 0, // 所截图片画在缓冲区中的左上角Y坐标
// scrRect, // 需要截图的区域
// GraphicsUnit.Pixel); // 此参数表示本次调用传入的参数以像素为单位

// // 指定被当做透明色的颜色值,这里使用纯白。
// // MSDN中SetColorKey的低值和高值可不相同,但这里必须相同,否则报错。原因未知。
// ImageAttributes imageAttr = new ImageAttributes();
// imageAttr.SetColorKey(Color.FromArgb(255, 255, 255), Color.FromArgb(255, 255, 255));

// // 将PictureBox的Image拷贝到Bitmap中,指定的颜色当做透明色
// g.DrawImage(pic.Image, // 将PictureBox的图片绘制在缓冲区中
// new Rectangle(0, 0, pic.Width, pic.Height), // 绘制区域,将PictureBox的图片按比例缩放绘制在这个区域内
// 0, // 截图区域的左边坐标,PictureBox必须覆盖为背景图之上
// 0, // 截图区域的上边坐标
// pic.Width, // 截图区域的宽度
// pic.Height, // 截图区域的高度
// GraphicsUnit.Pixel, // 此参数表示本次调用传入的参数以像素为单位
// imageAttr); // 透明色

// pic.Image = buffer;

// pic.Visible = true;
//}