WINFORM FORM/CONTROL不规则形状

主要思路是通过图片获取目标形状GraphicsPath,并赋值给Form或Control的Region属性。
1. 通过SetStyle设置支持透明背景
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
UpdateStyles();

2. 设置Size

control.Width = bitmap.Width;
control.Height = bitmap.Height;

3. FormBorderStyle.None(限Form)
form.FormBorderStyle = FormBorderStyle.None;

4. 获取图形路径
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;
}

5. Control.Region
control.Region = new Region(graphicsPath);

6. 设置图片(图片可后续更换)
form.BackgroundImage = bitmap;

posted @ 2017-09-05 09:42  sunlyk  阅读(445)  评论(0编辑  收藏  举报