创建规则的非矩形窗口:
在程序开头加上命名空间:
using System.Drawing;
在Windows窗体可视化的编程界面中放置好窗体和控件,比如窗体叫from1,在窗体的paint事件中加入重新绘制自己的代码就可以了。
所有的控件都有paint事件,在运行中都可以这样对自身的形状进行重新绘制。











可以把这段代码放到程序里,运行起来看一下效果。
创建不规则的异型窗体:
基本的思路是:创建一个性化的位图,把不想显示的地方设置成一种特殊的颜色。添加一个窗体,并把窗体的背景图设置为自己设计的位图,将特殊色设置为透明色。好了。
例子1:用于显示器颜色在24位以下的。
自己做一张图backPic.bmp,把边界以外的地方设置成黄色,添加窗体form2。
把窗体的backgroundImage属性设置成位图,transparencyKey属性设置成黄色。
添加代码使窗体能够关闭,最小化,移动等。
例子2:用于所有显示器。







BitmapRegion类的定义:还可以用于不规则控件。
using
System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace IrregularForm
{
public class BitmapRegion
{
public BitmapRegion()
{ }
// 创建支持位图区域的控件(目前有button和form)
public static void CreateControlRegion(Control control, Bitmap bitmap)
{
// 判断是否存在控件和位图
if (control == null || bitmap == null )
return ;
// 设置控件大小为位图大小
control.Width = bitmap.Width;
control.Height = bitmap.Height;
// 当控件是form时
if (control is System.Windows.Forms.Form)
{
// 强制转换为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);
}
// 当控件是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);
}
}
// 计算位图中不透明部分的边界
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; 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;
}
}
}
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace IrregularForm
{
public class BitmapRegion
{
public BitmapRegion()
{ }
// 创建支持位图区域的控件(目前有button和form)
public static void CreateControlRegion(Control control, Bitmap bitmap)
{
// 判断是否存在控件和位图
if (control == null || bitmap == null )
return ;
// 设置控件大小为位图大小
control.Width = bitmap.Width;
control.Height = bitmap.Height;
// 当控件是form时
if (control is System.Windows.Forms.Form)
{
// 强制转换为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);
}
// 当控件是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);
}
}
// 计算位图中不透明部分的边界
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; 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;
}
}
}