C#WinForm中实现异形窗体/控件

控件

制作异形窗体或控件的思路一般都是想办法生成一个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,制作出异形控件。

 

时间: 2024-09-29 17:18:13

C#WinForm中实现异形窗体/控件的相关文章

从在 Internet Explorer 中使用 Windows 窗体控件开始谈Smart Client

client|window|控件 首先引用Microsoft Windows 窗体快速入门教程上的文章"在 Internet Explorer 中使用 Windows 窗体控件":(如果引用的一些信息无法正常显示,请直接上面上的链接查看) 本主题描述如何在 Internet Explorer (IE) 内成功地执行 Windows 窗体控件.IE 内的 Windows 窗体控件无需用户提示即可激活,它不要求注册,而且利用公共语言运行库 (CLR) 代码访问安全性. 在 Internet

在IE浏览器中使用Windows窗体控件(一)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(一) 作者::Thiru Thangarathinam 翻译:秋枫 引言 在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端才具有的功能.不过现在开发者可以很容易的通过Microsoft.NET Framework来简洁和安全的建立对象,并且方便的在IE浏览器中切入使用.通过在IE浏览器中创建Windows窗体控件,开发者可以实现丰富的web客户端.在这篇文章中,我们将会知道怎样创建Windo

在IE浏览器中使用Windows窗体控件(二)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(二) 作者::Thiru Thangarathinam 翻译:秋枫 通过windows窗体控件访问Web Service 窗体控件一个重要优点就是你可以通过它在客户端实现丰富的用户信息.比如说,你可以通过窗体控件对Web服务的访问从而在IE中显示而不需要重新刷新该页面.为了演示这点,我们先来创建一个Web服务,接着再来演示怎样通过窗体控件调用Web服务. 创建Web service 我们创建一个 Visual C# Asp.n

在IE浏览器中使用Windows窗体控件(三)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(三) 作者::Thiru Thangarathinam 翻译:秋枫 调试Windows窗体控件 要调试窗体控件,你需要按照下面步骤进行. 1.打开浏览器并请求包含窗体控件的那个Html页面. 2.打开visual Studio.Net同时选择工具->调试进程就会显示下面的对话框. 在这个进程对话框中,选择IEXPLORE.EXE 点击附加按钮.当你点击附加按钮时会跳出一个对话框提示你选择要调试的程序类型.我们选择了Common

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

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

关于winform中多线程调用AX控件中的方法会阻塞UI线程的问题

问题描述 本人新手...winform中子线程调用AX控件中的某个耗时的方法(3.4秒)会阻塞UI线程,请问有没有办法在子线程中创建AX控件,让子线程去执行AX控件中的方法呢? 解决方案 解决方案二:你可以尝试直接在新的线程里执行该方法,不行的话只能由控件编写者提供异步的方法解决方案三:winform中子线程调用AX控件中的某个耗时的方法(3.4秒)会阻塞UI线程既然你是在子线程里调用,为什么会阻塞UI线程?放出你的代码来解决方案四:控件是vc写的,拖到form上的,SCM_Card_Chb是控

C#的WinForm中,如何实现控件的半透明?

问题描述 类似于下面图片所示: 解决方案 解决方案二:窗体透明可以在属性中设置,上面这个还不知道.解决方案三:默认不支持.不过可能能用GDI+自己画?解决方案四:可以重新设置一下控件的背景色.如button1.BackColor=Color.FromArgb(0,0,0,0);解决方案五:呵呵给分吧,做过的,你给控件加个背景图就可以了解决方案六:测试通过,楼主可以自己试一下publicpartialclassUserControl1:UserControl{publicUserControl1(

在WINFORM中,有webBrowser控件和HtmlDocument对象,那么ASP.NET里呢?

问题描述 小弟在WINFORM中,使用webBrowser请求某一网页,然后返回HTML代码,再用HtmlDocument对象提取出HTML代码中的需要的东西,现在要使用ASP.NET实现,请问有类似于这两种控件吗?1:webBrowser控件,不一定要可以看到页面,只要输入一个网址,既能请求并且获取到该网页中的HTML代码.2:HtmlDocument对象,可以用这个对象可以简单找到HTML代码中的元素上面两个东西,请问在ASP.NET里有没有什么可以实现的方法,谢谢大家! 解决方案 解决方案

在WPF工程中如何调用Windows窗体控件项目中控件属性、方法以及事件????

问题描述 运行环境:VS2008使用的工程:WPF应用程序以及Windows窗体控件库使用过程:新建一个Windows窗体控件库项目,这里名字叫MyControl新建一个Form窗体用来承载用户控件,这个Form窗体叫UerControl1,对应的文件名字为:UerControl1.vb在项目中添加对用户控件的必要的引用在项目中添加一个我下载的用户控件,这里名字叫A新建一个WPF工程,这里名字叫WPFProjWindow1.xaml文件的代码如下:<Windowx:Class="Windo