想做个非方形的控件,Paint里把部分区域设成透明没用,求解怎么做

解决方案 »

  1.   

    http://tech.ccidnet.com/art/294/20020918/25457_2.html
      

  2.   

    WinForm不支持透明,直接设置成透明的话会显示成父级控件的背景色
      

  3.   

    这个很容易实现的,主要是设置控件的Region属性,看下面的示例:
    ===BitmapRegion===using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    namespace 代码实现不规则窗体
    {
        public class BitmapRegion
        {
            public BitmapRegion(){}
            /// <summary>
            /// 创建支持位图区域的控件
            /// </summary>
            /// <param name="control">控件</param>
            /// <param name="bitmap">位图</param>
            public static void CreateControlRegion(Control control, Bitmap bitmap)
            {
                //判断是否存在控件和位图
                if (control == null || bitmap == null)
                    return;
                //设置控件大小为位图大小
                control.Width = bitmap.Width;
                control.Height = bitmap.Height;
                //当控件是FormByCode时
                if (control is System.Windows.Forms.Form)
                {
                    //强制转换为FORM
                    Form form = (Form)control;
                    //当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点
                    form.Width = control.Width + 20;
                    form.Height = control.Height + 35;
                    //没有边界
                    form.FormBorderStyle = FormBorderStyle.None;
                    //将位图设置成窗体背景图片
                    form.BackgroundImage = bitmap;
                    //计算位图中不透明部分的边界
                    GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
                    //应用新的区域
                    form.Region = new Region(graphicsPath);
                }
                //当控件是Button时
                else if (control is System.Windows.Forms.Button)
                {
                    //强制转换为Button
                    Button button = (Button)control;
                    //不显示button Text
                    button.Text = "";
                    //改变cursor 的 style
                    button.Cursor = Cursors.Hand;
                    //设置Button的背景图片
                    button.BackgroundImage = bitmap;
                    //计算位图中不透明部分的边界
                    GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
                    //应用新的区域
                    button.Region = new Region(graphicsPath);
                }
            }
            /// <summary>
            /// 计算位图中不透明部分的边界
            /// </summary>
            /// <param name="bitmap"></param>
            /// <returns>GraphicsPath</returns>
            private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
            {
                GraphicsPath graphicsPath = new GraphicsPath();
                //使用左上角的一点颜色来作为我们透明的颜色
                Color colorTransparent = bitmap.GetPixel(0, 0);
                //第一个找到点的x
                int colOpaquePixel = 0;
                //遍历所有行(Y方向)
                for (int row = 0; row < bitmap.Height; row++)
                {
                    //重设
                    colOpaquePixel = 0;
                    //遍历所有列(X方向)
                    for (int col = 0; col < bitmap.Width; col++)
                    {
                        //如果是不需要透明处理的点则标记,然后继续偏历
                        if (bitmap.GetPixel(col, row) != colorTransparent)
                        {
                            //记录当前
                            colOpaquePixel = col;
                            //建立新变量来记录当前点
                            int colNext = col;
                            //从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度
                            for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
                            {
                                if (bitmap.GetPixel(colNext, row) == colorTransparent)
                                    break;
                            }
                            //将不透明点加到graphics path
                            graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
                            col = colNext;
                        }
                    }
                }
                return graphicsPath;
            }
        }
    }===BitmapRegion===BitmapRegion BitmapRegion = new BitmapRegion();//此为生成不规则窗体和控件的类
    BitmapRegion.CreateControlRegion(this, new Bitmap("qq.gif"));