zoukankan      html  css  js  c++  java
  • C# Winform控件对透明图片重叠时的解决方法

    用C# winform开发界面时会遇到很多小问题,比如贴透明的png图片或GIF图片后,图片无法透明,这点可以通过属性设置:外观/BackColor (Web TransParent)可以解决。

    但当用多个控件时,如PictureBox,控件都贴透明图片后,两个PictureBox有重叠的地方,希望重叠的地方能透明,就是透视下面的控件部分,结果测试后发现两控件重叠透明的地方对整个框架的背景透明,但对下面控件无法透明,最后在网上找了一段代码,解决了这个问题。

    解决时,对每个控件使用:ControlTrans(pic,pic.Image);然后层叠之后就可以透明了。

            private unsafe static GraphicsPath subGraphicsPath(Image img)
            {
                if (img == nullreturn null;

                // 建立GraphicsPath, 给我们的位图路径计算使用   
                GraphicsPath g = new GraphicsPath(FillMode.Alternate);

                Bitmap bitmap = new Bitmap(img);

                int width = bitmap.Width;
                int height = bitmap.Height;
                BitmapData bmData = bitmap.LockBits(new Rectangle(00, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                byte* p = (byte*)bmData.Scan0;
                int offset = bmData.Stride - width * 3;
                int p0, p1, p2;         // 记录左上角0,0座标的颜色值  
                p0 = p[0];
                p1 = p[1];
                p2 = p[2];

                int start = -1;
                // 行座标 ( Y col )   
                for (int Y = 0; Y < height; Y++)
                {
                    // 列座标 ( X row )   
                    for (int X = 0; X < width; X++)
                    {
                        if (start == -1 && (p[0] != p0 || p[1] != p1 || p[2] != p2))     //如果 之前的点没有不透明 且 不透明   
                        {
                            start = X;                            //记录这个点  
                        }
                        else if (start > -1 && (p[0] == p0 && p[1] == p1 && p[2] == p2))      //如果 之前的点是不透明 且 透明  
                        {
                            g.AddRectangle(new Rectangle(start, Y, X - start, 1));    //添加之前的矩形到  
                            start = -1;
                        }

                        if (X == width - 1 && start > -1)        //如果 之前的点是不透明 且 是最后一个点  
                        {
                            g.AddRectangle(new Rectangle(start, Y, X - start + 11));      //添加之前的矩形到  
                            start = -1;
                        }
                        //if (p[0] != p0 || p[1] != p1 || p[2] != p2)  
                        
    //    g.AddRectangle(new Rectangle(X, Y, 1, 1));  
                        p += 3;                                   //下一个内存地址  
                    }
                    p += offset;
                } bitmap.UnlockBits(bmData);
                bitmap.Dispose();
                // 返回计算出来的不透明图片路径   
                return g;
            }

            /// <summary>  
            
    /// 调用此函数后使图片透明  
            
    /// </summary>  
            
    /// <param name="control">需要处理的控件</param>  
            
    /// <param name="img">控件的背景或图片,如PictureBox.Image  
            
    ///   或PictureBox.BackgroundImage</param>  
            public static void ControlTrans(Control control, Image img)
            {
                GraphicsPath g;
                g = subGraphicsPath(img);
                if (g == null)
                    return;
                control.Region = new Region(g);
            }

  • 相关阅读:
    第二次结对作业
    第二次编程作业
    第一次编程作业
    第一篇随笔
    个人总结
    用例图设计
    第二次个人编程作业
    第一次个人编程作业
    第一次博客作业
    个人总结-以梦为马,砥砺前行
  • 原文地址:https://www.cnblogs.com/SUNBOY/p/2210191.html
Copyright © 2011-2022 走看看