C#Winform中如何让PictureBox的背景透明

 我来答
xiangjuan314
推荐于2018-02-23 · TA获得超过3.3万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:2771万
展开全部

picturebox的backColor属性设置成Color.Transparent

然后设置picturebox.Parent = 父容器;


一般地,在.NET中,多个控件之间重叠时是不会实现透明效果的。 如下图所示:

下面开始介绍这几种解决方案: 

  第一种方案:记录不透明图片的路径,再设置透明效果。参考代码如下:

/// <summary>
    /// PictureBox透明示例
    /// Date:2012-3-4 07:25:56
    /// </summary>
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern int ReleaseCapture();

        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;

        public Form1()
        {
            InitializeComponent();
            //this.picModelImage.Controls.Add(this.picHair);
        }

        private void picHair_MouseDown(object sender, MouseEventArgs e)
        {
            SetPictureBoxTransparent(picHair, picHair.Image);
            //SetPictureBoxTransparent(picModelImage, picModelImage.Image);
            ReleaseCapture();
            SendMessage(this.picHair.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }

        // 使用不安全的指针
        // 返回不透明的图片路径
        private unsafe GraphicsPath NoteGraphicsPath(Image image)
        {
            if (image == null)
                return null;

            // 声明GraphicsPath类以便计算位图路径
            GraphicsPath graphicsPath = new GraphicsPath(FillMode.Alternate);
            Bitmap bitmap = new Bitmap(image);

            int picWidth = bitmap.Width;
            int picHeight = bitmap.Height;

            BitmapData bitmapdata = bitmap.LockBits(new Rectangle(0, 0, picWidth, picHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            byte* point = (byte*)bitmapdata.Scan0;
            int offset = bitmapdata.Stride - picWidth * 3;
            int p0, p1, p2;
            p0 = point[0];
            p1 = point[1];
            p2 = point[2];
            int start = -1;

            for (int h = 0; h < picHeight; h++)
            {
                for (int x = 0; x < picWidth; x++)
                {
                    // 如果之前的点没有不透明且不透明   
                    if (start == -1 && (point[0] != p0 || point[1] != p1 || point[2] != p2))
                    {
                        start = x;
                    }
                    else if (start > -1 && (point[0] == p0 && point[1] == p1 && point[2] == p2))
                    {
                        // 如果之前的点是不透明
                        graphicsPath.AddRectangle(new Rectangle(start, h, x - start - 1, 1));
                        start = -1;
                    }

                    // 如果之前的点是不透明且是最后一个点  
                    if (x == picWidth - 1 && start > -1)
                    {
                        graphicsPath.AddRectangle(new Rectangle(start, h, x - start + 1, 1));
                        start = -1;
                    }

                    point += 3;
                }

                point += offset;
            }

            bitmap.UnlockBits(bitmapdata);
            bitmap.Dispose();

            return graphicsPath;
        }

        /// <summary>
        /// 需要设置透明效果的控件调用该方法
        /// </summary>
        /// <param name="control">要设置透明效果的控件</param>
        /// <param name="image">控件的图片</param>
        public void SetPictureBoxTransparent(Control control, Image image)
        {
            GraphicsPath graphic = null;
            graphic = NoteGraphicsPath(image);

            if (graphic == null)
                return;

            control.Region = new Region(graphic);
        }
}

需要添加2个命名空间:

using System.Drawing.Drawing2D;

using System.Drawing.Imaging;

 

  运行后效果如下所示:

注意:由于本示例有不安全的代码[关键字unsafe],需要在项目属性中设置"允许不安全代码",如下图:


第二种方案:使用GDI +中绘制图像与透明

 

  这种方案是需要我使用GDI+绘制图像,具体步骤如下所示:

 

  1. 需要添加两个组件类:

  PictureBoxModel.cs 和 PanelExtend.cs

  PanelExtend.cs 中代码:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
/// <summary>
/// Panel扩展类
/// </summary>
public abstract class PanelExtend : Panel
{
    protected Graphics graphics;
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; // 实现透明样式
            return cp;
        }
    }
    public PanelExtend()
    {
    }
    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        this.graphics = e.Graphics;
        this.graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        this.graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
        this.graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
        this.graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        OnDraw();
    }
    protected abstract void OnDraw();
}


PictureBoxModel.cs  代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
/// <summary>
/// 实现绘制图像
/// </summary>
public class PictureBoxModel : PanelExtend
{
    public PictureBoxModel()
    {
        //this.SetStyle(System.Windows.Forms.ControlStyles.SupportsTransparentBackColor, true);
    }
    protected override void OnDraw()
    {
        // 获取图像
        Image imageModel = global::MyPictureBoxDemo.Properties.Resources.model;
        Image imageHair = global::MyPictureBoxDemo.Properties.Resources.hair;
        //int width = imageModel.Size.Width;
        //int height = imageModel.Size.Height;
        int width = this.Width;
        int height = this.Height;
        Rectangle recModel = new Rectangle(0, 0, width, height);
        Rectangle recHair = new Rectangle(0, 0, imageHair.Width, imageHair.Height);
        
        this.graphics.DrawImage(imageModel, recModel);
        this.graphics.DrawImage(imageHair, recHair);
    }
}

实现效果图如下所示:

lhyAiralhy
推荐于2016-01-28 · TA获得超过469个赞
知道小有建树答主
回答量:327
采纳率:0%
帮助的人:258万
展开全部
picturebox的backColor属性设置成Color.Transparent
然后设置picturebox.Parent = 父容器;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
332150481
2014-11-06 · 超过44用户采纳过TA的回答
知道小有建树答主
回答量:112
采纳率:0%
帮助的人:58万
展开全部
这个只需要设置控件的ForeColor为Transparent就可以了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式