QQ窗体是圆角的,Kugoo窗体也是圆角的,QQ的输入法皮肤窗体是不规则的。。。等N多日常使用的程序主窗体都不是四四方方的,其实都是调用2D绘画函数按指定的路径画出来的,那么这一课我给入门级学者讲解的是关于C#实现这一功能。
先来看看实现效果(左边的字体也是窗体的一部分):
其实其核心就是围绕Drawing2D来实现的,用GraphicsPath的方法GetPixel取左上角的一点的颜色作为我们透明色,然后横坚循环遍历每一个像素坐标点,如果发现其为透明色,则不加入绘制窗体区域。
下面看怎么实现的,看图:
关键点:
第一、设置当前窗体为无边框的(this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;);
第二、排除捕获对错误线程的调用,CheckForIllegalCrossThreadCalls = false;
第三、计算位图中不透明部分的边界,代码如下:
#region //计算位图中不透明部分的边界private GraphicsPath CalculateControlGraphicsPath(Bitmap bitmap) {//创建 GraphicsPath GraphicsPath graphicsPath = new GraphicsPath();//使用左上角的一点的颜色作为我们透明色 Color colorTransparent = bitmap.GetPixel(0, 0); // 偏历所有行(Y方向) for (int row = 0; row < bitmap.Height; row++) {//第一个找到点的X int colOpaquePixel = 0;//偏历所有列(X方向) for (int col = 0; col < bitmap.Width; col++) {//如果是不需要透明处理的点则标记,然后继续偏历 if (bitmap.GetPixel(col, row) != colorTransparent) {//记录当前 colOpaquePixel = col;///从找到的不透明点开始,继续寻找不透明点,一直到找到或则达到图片宽度 while (col < bitmap.Width)if (bitmap.GetPixel(col++, row) == colorTransparent)break;//将不透明点加到graphicspath graphicsPath.AddRectangle(new Rectangle(colOpaquePixel, row, col - colOpaquePixel - 1, 1)); } } }return graphicsPath; }#endregion
第四、设置当前窗体的绘制路径区域
this.Region = new Region(this.CalculateControlGraphicsPath(this.BackgroundImage as Bitmap));
代码下载地址:WindowsFormsApplication1.rar
时间: 2024-07-30 02:54:31