C#WinForm制作异形窗体/控件

  • A+
所属分类:C#

C#WinForm制作异形窗体/控件-.NET教程,C#语言 - 未来软件 - CSDN博客

C#WinForm制作异形窗体/控件-.NET教程,C#语言

制作异形窗体或控件的思路一般都是想办法生成一个region,然后设置给指定的窗口或控件。生成region的方法有非常多,最常用的就是从一幅图片生成,把该图片中的透明色部分“抠”掉,剩下的部分作为一个region。设置窗口或控件的region能用setwindowrgn api,不过.net framework封装了这个操作,在c#中只要对窗口或控件的region属性赋值就能了。下面我就把我在c#中实现异形窗体的核心代码贴出来给大家看看,有什么意见尽管提,别客气哦j 首先,是个根据bitmap对象生成region的方法:

///

/// 取得一个图片中非透明色部分的区域。
///

///取其区域的图片。 ///透明色。 /// 图片中非透明色部分的区域
private region bmprgn(bitmap picture, color transparentcolor)
{
     int nwidth = picture.width;
     int nheight = picture.height;
     region rgn = new region();
     rgn.makeempty();
     bool istransrgn;//前一个点是否在透明区
     color curcolor;//当前点的颜色
     rectangle currect = new rectangle();
     currect.height = 1;
     int x = 0, y = 0;
     //逐像素扫描这个图片,找出非透明色部分区域并合并起来。
     for(y = 0; y < nheight; ++y)
     {
         istransrgn = true;
         for (x = 0; x < nwidth; ++x)
         {
              curcolor = picture.getpixel(x,y);
              if(curcolor == transparentcolor || x == nwidth - 1)//如果遇见透明色或行尾
                   {
                       if(istransrgn == false)//退出有效区
                       {
                            currect.width = x - currect.x;
                            rgn.union(currect);
                       }
                   }
                   else//非透明色
                   {
                       if(istransrgn == true)//进入有效区
                       {
                            currect.x = x;
                            currect.y = y;
                       }
                   }//if curcolor
                   istransrgn = curcolor == transparentcolor;
              }//for x
         }//for y

return rgn;      }   原理非常简单,就是对该图片逐行扫描,在每一行中把那些非透明色的矩形(只有一个像素高)合并(union)到一个region对象中,当扫描完整个图片,得到的也就是我们想要的region了。这种算法在非常多文章里都有介绍的。   有了region,下面就简单了: this.region = bmprgn(new bitmap("d:\\a.bmp"), color.fromargb(0, 0, 0)); 上面的代码就是把d:\a.bmp的轮廓作为主窗口的region的,假设该图片的背景黑色(color.fromargb(0, 0, 0))。其实不光是form,所有控件都能用这个方法设置region,制作出异形控件。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin