winform实现不规则窗体及控件

根据背景图片实现不规则的winform控件,实际是找到图片的不透明区域,最后把控件的Region区域重置。
使没有图片,也可以根据自己的需要创建graphicsPath,最终绘制自己需要的图形来实现不规则的winform控件


GraphicsPath graphicsPath = CalculateControlGraphicsPath(new Bitmap(panel1.BackgroundImage));
   panel1.Region = new Region(graphicsPath);

   ///
   /// Calculate the graphics path that representing the figure in the bitmap
   /// excluding the transparent color which is the top left pixel.
   /// //计算位图中不透明部分的边界
   /// The Bitmap object to calculate our graphics path from
   /// Calculated graphics path
   private static GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap)
   {
       // Create GraphicsPath for our bitmap calculation
       //创建 GraphicsPath
       GraphicsPath graphicsPath = new GraphicsPath();
       // Use the top left pixel as our transparent color
       //使用左上角的一点的颜色作为我们透明色
       Color colorTransparent = bitmap.GetPixel(0, 0);
       // This is to store the column value where an opaque pixel is first found.
       // This value will determine where we start scanning for trailing opaque pixels.
       //第一个找到点的X
       int colOpaquePixel = 0;
       // Go through all rows (Y axis)
       // 偏历所有行(Y方向)
       for (int row = 0; row < bitmap.Height; row++)
       {
           // Reset value
           //重设
           colOpaquePixel = 0;
           // Go through all columns (X axis)
           //偏历所有列(X方向)
           for (int col = 0; col < bitmap.Width; col++)
           {
               // If this is an opaque pixel, mark it and search for anymore trailing behind
               //如果是不需要透明处理的点则标记,然后继续偏历
               if (bitmap.GetPixel(col, row) != colorTransparent)
               {
                   // Opaque pixel found, mark current position
                   //记录当前
                   colOpaquePixel = col;
                   // Create another variable to set the current pixel position
                   //建立新变量来记录当前点
                   int colNext = col;
                   // Starting from current found opaque pixel, search for anymore opaque pixels
                   // trailing behind, until a transparent   pixel is found or minimum width is reached
                   ///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度
                   for (colNext = colOpaquePixel; colNext < bitmap.Width; colNext++)
                       if (bitmap.GetPixel(colNext, row) == colorTransparent)
                           break;
                   // Form a rectangle for line of opaque   pixels found and add it to our graphics path
                   //将不透明点加到graphics path
                   graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, colNext - colOpaquePixel, 1));
                   // No need to scan the line of opaque pixels just found
                   col = colNext;
               }
           }
       }
       // Return calculated graphics path
       return graphicsPath;
   }