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

控件

制作异形窗体或控件的思路一般都是想办法生成一个region,然后设置给指定的窗口或控件。生成region的方法有很多,最常用的就是从一幅图片生成,把该图片中的透明色部分“抠”掉,剩下的部分作为一个region。设置窗口或控件的region可以用SetWindowRgn API,不过.NET framework封装了这个操作,在C#中只要对窗口或控件的Region属性赋值就可以了。下面我就把我在C#中实现异形窗体的核心代码贴出来给大家看看,有什么意见尽管提,别客气哦J首先,是一个根据Bitmap对象生成Region的方法:/// <summary>/// 取得一个图片中非透明色部分的区域。/// </summary>/// <param name="Picture">取其区域的图片。</param>/// <param name="TransparentColor">透明色。</param>/// <returns>图片中非透明色部分的区域</returns>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,制作出异形控件。

时间: 2025-01-21 00:37:28

C#WinForm制作异形窗体/控件的相关文章

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

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

winform运用IrisSkin2皮肤控件引发的问题 之前设置的窗体属性都失效了 怎么解决?

问题描述 winform运用IrisSkin2皮肤控件引发的问题 之前设置的窗体属性都失效了 怎么解决? winform运用IrisSkin2皮肤控件引发的问题 之前设置的窗体属性都失效了 怎么解决?之前设置的 窗体 可拖动 用了皮肤控件后 能拖动了 怎么解决这些? 解决方案 安装的是原版的控件还是修改版的,版本和你的vs的版本是否兼容.你说的失效是什么意思?

c#winform窗体控件工具栏

问题描述 c#winform窗体控件工具栏 解决方案 ToolStrip,你最好能够找本C#教程或者PDF教程读一下,这些控件vs都自带的.

如何在多线程中调用winform窗体控件

由于 Windows 窗体控件本质上不是线程安全的.因此如果有两个或多个线程适度操作某一控件的状态(set value),则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用和死锁的情况.于是在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException  本文用一个很简单的示例来讲解这个问题(在窗体上放一个TextBox和一个Button,点击Button后,在新建的线程中设置T

利用.NET绘图技术制作水晶按钮控件

按钮|控件 UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序.UI编程体现在两个方面,一是设计精美的用户界面,再有就是符合大多数用户习惯和易于使用的操作流程,而制作出精美的.绚丽多彩的用户界面是博得最终用户喜爱的第一步.我们就以制作一个水晶样式的三维按钮为例来丰富.Net界面素材库,为Windows 窗体程序增加亮点. 一. 技术要点 不可否认的是,Windows编程已经

WPF中嵌入WinForm中的webbrowser控件

原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能使用.决定还是使用WinForm中的webbrowser.要想在WPF中使用WinForm控件,查看MSDN,需经过以下步骤. 创建名为 HostingWfInWpf 的 WPF 应用程序项目. 在解决方案资源管理器中,添加一个对名为 WindowsFormsIntegration.dll 的 Wi

winform-C# Winform 动态Add用户控件,比设置用户控件Visible的效率高还是低?

问题描述 C# Winform 动态Add用户控件,比设置用户控件Visible的效率高还是低? 如何题:C# Winform 动态Add用户控件,比设置用户控件Visible的效率高还是低? 解决方案 肯定相关代码要比设置是否可见复杂,但是动态添加相对灵活性要高,而不用有用没用的都摆在那 解决方案二: C#的Winform中使用用户控件C# WinForm中添加用户控件 解决方案三: 1.动态Add用户控件,是窗体加载后,重新绘制加载用户控件,有可能出现界面闪烁刷新效果: 2.设置用户控件Vi

C# winform 如何在Panel控件的拖拽DragDrop事件中获取Label对象

问题描述 C# winform 如何在Panel控件的拖拽DragDrop事件中获取Label对象 在C# winform中,在form窗体中有四个Panel控件(panel1.panel2.panel3.panel4)以及三个Label控件(label1.label2.label3). 目前需要将任意一个Label控件对象拖入任意一个Panel控件中.一旦松开鼠标,那么拖拽过程结束.此时应当处理Panel控件的DragDrop事件. 请问,在Panel控件的DragDrop事件中,如何获取La

panel-C# winform 如何在Panel控件的拖拽DragDrop事件中获取Label对象

问题描述 C# winform 如何在Panel控件的拖拽DragDrop事件中获取Label对象 在C# winform中,在form窗体中有四个Panel控件(panel1.panel2.panel3.panel4)以及三个Label控件(label1.label2.label3). 目前需要将任意一个Label控件对象拖入任意一个Panel控件中.一旦松开鼠标,那么拖拽过程结束.此时应当处理Panel控件的DragDrop事件. 请问,在Panel控件的DragDrop事件中,如何获取La