Home >Backend Development >C#.Net Tutorial >C# winform creates irregular forms (code)

C# winform creates irregular forms (code)

PHPz
PHPzOriginal
2017-04-03 11:45:122344browse

In the past, when I wanted to make irregular forms, I mostly used API functions to achieve it. In C#, you can still make beautiful irregular forms without using API functions. The following is an introduction to the relevant methods. The following is the code.

        private void Form1_Load(object sender, EventArgs e)
        {
            //重新绘制窗口样式
            string fileName = @"C:\Users\admin\Desktop\Yuan1.png";
            Bitmap mybitmap = new Bitmap(fileName);
            CreateControlRegion(this, mybitmap);
            this.BackColor = Color.White;// 此处为添加部分  
            this.TransparencyKey = Color.White;//此处为添加部分  
        }
        /// <summary>
        /// 重新绘制窗口样式
        /// </summary>
        /// <param name="control"></param>
        /// <param name="bitmap"></param>
        public static void CreateControlRegion(Control control, Bitmap bitmap)
        {
            // Return if control and bitmap are null  
            //判断是否存在控件和位图  
            if (control == null || bitmap == null)
                return;
            //设置控件大小为位图大小  
            control.Width = bitmap.Width;
            control.Height = bitmap.Height;
            // Check if we are dealing with Form here   
            //当控件是form时  
            if (control is System.Windows.Forms.Form)
            {
                // Cast to a Form object  
                //强制转换为FORM  
                Form form = (Form)control;
                //当FORM的边界FormBorderStyle不为NONE时,应将FORM的大小设置成比位图大小稍大一点  
                form.Width = control.Width;
                form.Height = control.Height;
                //没有边界  
                form.FormBorderStyle = FormBorderStyle.None;
                //将位图设置成窗体背景图片  
                form.BackgroundImage = bitmap;
                //计算位图中不透明部分的边界  
                GraphicsPath graphicsPath = CalculateControlGraphicsPath(bitmap);
                //应用新的区域  
                form.Region = new Region(graphicsPath);

                // 以下为自己添加的语句,不添加此两句会出现问题  
                form.Width = bitmap.Width;
                form.Height = bitmap.Height;
            }

            //当控件是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);
                // Apply new region   
                //应用新的区域  
                button.Region = new Region(graphicsPath);
                button.Width = bitmap.Width;
                button.Height = bitmap.Height;
                button.FlatStyle = FlatStyle.Popup;//此处为添加部分  
            }
        }
        private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
        {
            //创建 GraphicsPath  
            GraphicsPath graphicsPath = new GraphicsPath();

            //使用左上角的一点的颜色作为我们透明色  
            Color colorTransparent = bitmap.GetPixel(0, 0);

            //第一个找到点的X  
            int colOpaquePixel = 0;

            // 偏历所有行(Y方向)  
            for (int row = 0; row < bitmap.Height - 1; row++)
            {
                // Reset value   
                //重设  
                colOpaquePixel = 0;

                //偏历所有列(X方向)  
                for (int col = 0; col < bitmap.Width - 1; col++)
                {
                    //如果是不需要透明处理的点则标记,然后继续偏历  
                    if (bitmap.GetPixel(col, row) != colorTransparent)
                    {

                        colOpaquePixel = col;

                        //建立新变量来记录当前点  
                        int colNext = col;

                        ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度   
                        for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
                        {
                            Color gpi = bitmap.GetPixel(colNext, row);
                            if (bitmap.GetPixel(colNext, row) == colorTransparent)
                            {

                                break;
                            }
                        }
                        //将不透明点加到graphics path  

                        {
                            graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
                        }
                        col = colNext;
                    }
                }
            }
            return graphicsPath;
        }

Perfect!

The above is the detailed content of C# winform creates irregular forms (code). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn