3WINFORM自定义皮肤制作
- 格式:pdf
- 大小:250.37 KB
- 文档页数:10
DevExpress.换肤DevExpress 换肤原帖地址:(不好意思啊,弄丢了)特感谢作者;为软件换肤,是一个永恒的主题,winforms换肤,现在b/s也换肤。
呵呵。
在devexpress中,换肤就很简单,不需要我们自己去制造皮肤,官文就有很丰富的皮肤包。
下面来讲解一下这个问题。
注意,我这儿用的是DevExpress 8.1.5,在老版本中可能不支持。
如果是7.x的版本,请见demo中的源代码。
第一步:让所有窗体都从DevExpress.XtraEditors.XtraForm继承。
第二步:添加两个引用:DevExpress.BonusSkins.v8.1DevExpress.OfficeSkins.v8.1第三步:在软件的入口Program类的main函数的第一行代码前加上:erSkins.BonusSkins.Register();erSkins.OfficeSkins.Register();DevExpress.Skins.SkinManager.EnableFormSkins();Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new FormMain());第四步:每个窗口放个DefaultLookAndFeel控件,第五步:软件往往有个设置皮肤的地方,这个地方往往是需要枚举出所有皮肤的,把皮肤全部枚举出来放到一个ComboBoxEdit中,代码如下:foreach (DevExpress.Skins.SkinContainer skin in DevExpress.Skins.SkinManager.Default.Skins)cmbAppStyle.Properties.Items.Add(skin.SkinName);第六步:设置皮肤,怎样设置皮肤呢,只需设置每个窗口的DefaultLookAndFeel即可,代码如下:this.defaultLookAndFeel1.LookAndFeel.SkinName = cmbAppStyle.EditValue.ToString();或者: string skinName = e.Item.Caption; //没测试MDI窗体erLookAndFeel.Default.SetSkinS tyle(skinName);现在,大部分的问题都解决了,最后一个问题,怎样在设置皮肤时,将所有已打开的窗口的皮肤都改成对应的样式呢?(在DevExpress8.1.5中,这个功能自带,但是,并不完全,有缺陷)最基本的方法当然是观察者模式,但是,我想到在winforms中应当有枚举所有已打开窗口的方法。
csharpskin 用法
C# Skin是一种用户界面设计工具,用于创建C#(C Sharp)编
程语言的Windows窗体应用程序的外观和样式。
C#是一种由微软开
发的面向对象的编程语言,广泛用于开发Windows应用程序和Web
应用程序。
C# Skin可以帮助开发人员创建具有吸引人外观和用户
友好界面的应用程序,提供了一种简便的方式来自定义控件的外观,包括按钮、文本框、标签等。
使用C# Skin,开发人员可以通过修改控件的外观属性来实现
自定义的界面设计,比如改变按钮的颜色、边框样式、文字样式等。
这使得开发人员可以轻松地创建个性化的应用程序界面,以满足用
户的审美需求和品牌要求。
另外,C# Skin还提供了一些预设的主题和样式,开发人员可
以直接使用这些主题和样式,而无需从头开始设计界面。
这样可以
节省开发时间,并且确保应用程序的外观符合当前的设计趋势。
总的来说,C# Skin是一个用于创建个性化和吸引人的用户界
面的工具,它为C#开发人员提供了丰富的外观定制选项,使他们能
够轻松地打造出令人印象深刻的应用程序界面。
使用C#制作个性化窗体winform 界面引言:谁都希望自己的应用程序能让人留下一个深刻的印象,让自己的程序窗体有一件与众不同的"外衣"是一个好办法。
试想:在一大堆的普通窗口中突然跳出一个很酷的界面,一定能让人眼睛一亮进而产生兴趣的。
在VB,VC中如何定制可伸缩个性化窗口早就不是什么秘密了,已经有了大量相关的文章进行介绍,无非都是如何调用系统API之类的方法,但是在.Net中调用API却相对比较麻烦,所以使用.Net制作个性化窗体的文章也有一些,一般都是使用透明背景加图片的方式,所以不能移动或者不能任意放大缩小窗体。
那有没有不需要调用系统API的方法来实现可伸缩的个性化窗体的办法呢?当然有,.Net Framework 提供了一套非常强大的系统类库,我们下面就要做一个使用"纯".Net打造的可伸缩个性化窗体。
我们需要将窗体所有的"皮肤"全部换成我们自己定义的,包括标题栏,边框和系统按纽等,所以我们首先需要定做一套自己的皮肤图形文件。
因为窗体是可伸缩的,所以我们不能简单的取一整幅图片来作为窗体皮肤,而是根据需要先将图片切割为不同的部分,一般来说,有以下图示几大部分(红线为切割线):根据方位,将图片各部分命名为:Bottom_Left,Bottom_Middle,Bottom_Right,Middle_Left,M iddle_Right,Top_Left,Top_Middle,Top_Right,SysButton_Min,SysButton_Max,SysButt on_Close,SysButton_Restore等。
注意,有些图片是可以伸缩的地方,比如Middle_Left,Bottom_Middle等处的图片可以只是一小块,以后需要进行重复贴图。
而有些固定大小的图片,比如Bottom_L eft,Top_Left等以后只用贴一次,实际应用的时候要注意区分。
winform自定义方法Winform自定义方法Winform是一种用于创建Windows桌面应用程序的技术框架,它提供了丰富的用户界面控件和功能,使开发人员能够快速构建强大且易于使用的应用程序。
在Winform中,我们可以利用自定义方法来组织和管理代码,提高代码的复用性和可维护性。
本文将介绍Winform自定义方法的基本概念和使用技巧。
一、什么是自定义方法自定义方法是一段封装了特定功能的代码块,可以在程序中被多次调用。
通过使用自定义方法,我们可以将一段代码逻辑独立出来,使得代码更加结构化和模块化。
在Winform中,我们可以在类中定义自己的方法,并通过调用这些方法来实现特定的功能。
二、定义自定义方法在Winform中定义自定义方法非常简单,只需要在类中声明一个方法,然后在方法体中编写相应的代码即可。
以下是一个简单的例子:```csharpprivate void MyCustomMethod(){// 这里编写自定义方法的代码逻辑// ...}```在上面的例子中,我们定义了一个名为MyCustomMethod的自定义方法,它没有任何参数和返回值。
在方法体中,我们可以编写任意的代码逻辑,实现自己想要的功能。
三、调用自定义方法定义好自定义方法后,我们可以在任何需要的地方调用这个方法。
调用方法非常简单,只需要使用方法名加上一对括号即可。
以下是一个调用自定义方法的例子:```csharpprivate void button1_Click(object sender, EventArgs e){// 调用自定义方法MyCustomMethod();}```在上面的例子中,我们在按钮的点击事件中调用了名为MyCustomMethod的自定义方法。
当用户点击按钮时,程序会执行MyCustomMethod中定义的代码逻辑。
四、传递参数自定义方法还可以接受参数,以便在调用方法时传递数据。
通过传递参数,我们可以在方法内部使用这些数据来完成特定的任务。
CorePlex开发手记:一、Winform窗体皮肤及简单换肤机制CorePlex开发手记:一、Winform窗体皮肤及简单换肤机制前言: CorePlex代码库作为一个Visual Studio插件, 允许用户通过VS直接访问在线代码库。
开发过程中我翻阅了很多网上的资料,也总结了一些技术要点,现写成系列文章,以飨读者。
同时,里面某些技术也是我第一次使用,如有不对的地方,还请行家狠拍,欢迎大家指正~闲话休絮,进入正题。
从本篇文章开始,介绍 CorePlex 的窗体皮肤机制,以及简单的换肤功能。
我们先来看看效果:换一个皮肤看看:需要实现的是圆角窗体+四周的阴影,要实现这个,大致的思路是这样的:先使用 Graphics 绘制一个 Bitmap,将需要的皮肤绘制成一个内存图,然后使用 Win32的API:UpdateLayeredWindow 将这个构造好的 Bitmap 绘制/更新到窗体上。
我们来看看具体的实现吧。
第一部分,构造皮肤背景。
为了实现圆角以及四周的阴影,我将窗体背景划分成了九宫格的形式:主要思路是:除5 之外的其他部分,都作为窗体的边框和圆角来处理。
而5这个部分,则作为圆角窗体的主体背景部分。
1、3、7、9四个部分,作为圆角,我使用PathGradientBrush 来绘制扇形渐变,而2、4、6、8四个部分,作为边框,我使用LinearGradientBrush 来绘制线性渐变。
不多说,见代码:/// <summary>/// 绘制四角的阴影/// </summary>/// <param name="g"></param>/// <param name="corSize">圆角区域正方形的大小</param> /// <returns></returns>private void DrawCorners(Graphics g, Size corSize){/** 四个角,每个角都是一个扇面* 画图时扇面由外弧、内弧以及两段的连接线构成图形* 然后在内弧中间附近向外做渐变** 阴影分为9宫格,5为内部背景图部分* 1 2 3* 4 5 6* 7 8 9*/Action<int> DrawCorenerN = (n) =>{using (GraphicsPath gp = new GraphicsPath()){// 扇面外沿、内沿曲线的尺寸Size sizeOutSide = new Size(corSize.Width * 2, corSize.Height * 2);Size sizeInSide = new Size(this.SkinOptions.CornerRadius * 2, this.SkinOptions.CornerRadius * 2);// 扇面外沿、内沿曲线的位置Point locationOutSide, locationInSide;// 当圆角半径小于MinCornerRadius时,内沿不绘制曲线,而以线段绘制近似值。
跟我学做c#皮肤美化(四)源码下载做了许多的用户控件,现在让我们换换口味,开始窗体的制作吧!这个窗体的制作可以说是整个美化中比较重要的一部分,因为她显示的是整个美化的窗体。
而且内容也比较多,所以我会分几篇把她讲完,而且窗体制作的时候会和前面控件将的时候不一样,我不会在第一篇把最后的代码就放出来,而是希望做成跟着我一起一个版本一版本的完成不断的修改不断的发现问题并去完善。
这也是我做这个时候的一个思路:先做一个大致的框架,然后在其基础上增加功能或者发现问题,最后完成功能和解决问题。
不知道大家感觉这样是不是更好一点呢?好了,不多说了,先看最终的效果图:怎么样?是不是有点心动了?下面就正式开始吧!首先在以前的项目QLFUI上新建一个窗体(不是用户控件咯)并重新命名为MainFor m。
如图:接着来设置几个属性,如下:FormBorderStyle:NoneSize:300,300接下来就是用picturebox 和 panel来布局了。
这一部分可能比较繁琐。
首先总体介绍一下大概的布局。
见图:因为我们做的窗体是圆角的,所以窗体的四个角上(红色)我们会放上四个p icturebox。
标题栏和状态栏(蓝色)会是两个panel。
二个边框线(绿色)是两个p icturebox。
最后的主体部分(棕色)是一个panel。
说完了大体的布局,下面就来动手做啦。
一个一个来:左上角Name:ptbtlLocation:0,0Size:10,31上方的标题栏Modifiers:Protected;Name:paneltLocation:10,0Size:280,31右上角Name:ptbtrLocation:290,0Size:10,31左侧的边框线Name:ptbmlLocation:0,31Size:2,232主窗体部分Modifiers:Protected;BackgroundImageLayout:StretchName:panelmLocation:2,31Size:296,232右侧的边框线Name:ptbmrLocation:298,31Size:2,232左下角Name:ptbblLocation:0,263Size:10,37下方的状态栏Modifiers:Protected;Name:panelbLocation:10,263Size:280,37右下角Name:ptbbrLocation:290,263Size:10,37最后还有右上方的三个按钮可不要忘记了,注意按钮都是在panelt里面设置的而且这三个按钮都是我们前面做的按钮哦,终于派上用场啦!最小化按钮Caption:0Name:btminLocation:180,0Size:31,22最大化按钮Caption:0Name:btmaxLocation:211,0Size:31,22关闭按钮Caption:0Name:btcloseLocation:243,0Size:37,22还原按钮Caption:0Name:btresLocation:211,-30Size:31,22最后再加上一个label作为窗体的标题Name:lbtitleLocation:6,9Size:35,12BackColor:Transparent呼,终于结束了!不知道大家有没有晕乎乎的感觉,反正我是有点儿了,呵呵。
使⽤SkinEditor ⾃定义主题⽪肤使⽤SkinEditor ⾃定义主题⽪肤MS Office 是⼀套⽐较经典的办公软件,它包括多个应⽤产品,相似的风格,不同的功能,降低了⽤户的使⽤难度。
使⽤DevExpress 除了使⽤多种内置⽪肤外,还可以⾃定义特定的主题和样式。
新建⼯程在VS 扩展菜单DevExpress 中打开SkinEditor ,路径为 C:\Program Files (x86)\DevExpress18.1\Components\Tools\Windows Forms\SkinEditor2.exe创建⼯程,并可以选择⼀个模板主题⽪肤。
启动主界⾯,如下图所⽰,包括⼯具栏、元素列表、预览窗⼝、属性窗⼝和编辑窗⼝。
修改⽪肤可对多种元素进⾏颜⾊、样式等修改,为了快速实现效果,这⾥使⽤SkinPalette 来⼀键修改。
修改前后的效果对⽐如下:导出⽂件修改⽪肤后,设置⽪肤名称(这个Skin Name 在代码设置主题时需要使⽤)在菜单栏中导出⽪肤,创建程序集Bezier Blue.dll :将⾃动⽣成C#和VB ⽰例代码:主题应⽤在解决⽅案的⼯程中添加⽣成的⾃定义⽪肤引⽤Bezier Blue.dll在Main 函数中添加引⽤using System;using System.Windows.Forms;using DevExpress.Skins;using DevExpress.LookAndFeel;using System.Reflection;using ponentModel;using DevExpress.XtraEditors;namespace CustomSkinTest {static class Program {[STAThread]static void Main() {Assembly asm = typeof(erSkins.MyCustomSkins).Assembly;DevExpress.Skins.SkinManager.Default.RegisterAssembly(asm);//启动或等待窗⼝注册//SplashScreenManager.RegisterUserSkins(asm);SkinManager.EnableFormSkins();Application.Run(new XtraForm());}// 运⾏时主题可见,需要写⼊以下代码public class SkinRegistration : Component {public SkinRegistration() {DevExpress.Skins.SkinManager.Default.RegisterAssembly(typeof(erSkins.CustomSkin).Assembly); }}}}在主窗体中设置主题名称:UserLookAndFeel.Default.SkinName = "Bezier Green";。
C# 窗体皮肤1、静态换肤1.将IrisSkin2.dll文件引入到工程中。
2.在vs的工具箱中点右键,选择“选择项”。
3.在.NET Framework组件页签中选择SkinEngine,确定,关闭窗口。
4.将工具箱中的SkinEngine拖到窗体上,在SkinEngine的SkinFile属性上选择要添加的皮肤文件。
使用方法(1)将IrisSkin2压缩包解开,把里面的类库文件箱添加到vs的工具箱,方法是选择工具菜单选项里的添加工具箱项。
(2)在工具箱里找到新添加的控件图标SkinEngine,将这个图标拖放到你想改变皮肤的第一个窗体上(注意,一定是第一个被运行出来的窗体)(3)添加ssk皮肤文件。
(4)在窗体上找到SkinEngine图标,然后选择属性,在属性里找到SkinFile,点选择按扭,找到皮肤文件,就可以达到切换WinForms皮肤的效果。
(5)如果需要在运行时候动态切换皮肤,需要将多个皮肤添加到SkinEngine的一个集合属性(AddtionalBuiltInSkins)里,点添加成员,给成员指定一个皮肤文件。
然后写代码来调用。
this.skinEngine1.ApplyAdditionalBuiltInSkins(index); (index,代表皮肤集合里的索引,从0开始编号)private void Form1_Load(object sender, EventArgs e){skinEngine1.SkinFile = "DiamondBlue.ssk";}皮肤文件放到Debug文件下也可以在窗体的构造函数下添加该句代码,2、动态换肤using System;using System.Collections.Generic;using System.Text;using System.Windows.Forms;using System.Data;//TestSkin命令空间,别忘了改成你自己的。
WINFORM自定义皮肤制作(上)最近要做个软件正在做技术准备,由于WINFORM生成的窗体很丑陋,一个好的软件除了功能性很重要外,UI的体验也是不容忽视的。
习惯性的在网上搜素了下,换肤控件也有好几款,但是有些用起来不是很好用,好点的也要花很多银子哦,而且毕竟是别人写的,心里总不是个滋味,所以决定自己尝试着写写看,花了一个晚上终于做出来了个DEMO,貌似还不错,贴图如下(图片是直接是用的暴风影音的,寒自己一个。
)下面和大家分享下。
首先分析下皮肤的制作原理,我的理解是把整个窗体(去边框后)划分为9个区域(如果有更复杂的界面,可以划分更多),有图有真相:然后准备皮肤素材,切图,我的切图如下:接着可以开工了:1.初始化图片资源变量protected int formMinX=0;//最小化按钮的X坐标protected int formMaxX=0;//最大化按钮的X坐标protected int formCloseX=0;//关闭按钮的X坐标protected int formTitleMarginLeft=0;//标题栏的左边界protected int formTitleMarginRight=0;//标题栏的右边界Image imgTopLeft=(Image)Resources.topleft;//窗体顶部左上角图片Image imgTopRight=(Image)Resources.topright;//窗体顶部右上角图片Image imgTopMiddle=(Image)Resources.topstretch;//窗体顶部中间图片Image imgBottomLeft=(Image)Resources.bottomLeft;//窗体底部左下角图片Image imgBottonRight=(Image)Resources.bottomRight;//窗体底部右下角图片Image imgBottonmMiddle=(Image)Resources.bottomstretch;//窗体底部中间图片Image imgMiddleLeft=(Image)Resources.LeftDrag_Mid;//窗体中部左边框图片Image imgMiddleRight=(Image)Resources.RightDrag_Mid;//窗体中部右边框图片Image imgFormMin=(Image)Resources.skin_btn_min;//最小化按钮Image imgFormMax=(Image)Resources.skin_btn_max;//最大化按钮Image imgFormClose=(Image)Resources.skin_btn_close;//关闭按钮Image imgFormRestore=(Image)Resources.skin_btn_restore;//还原按钮2.重写OnPaint事件。
代码直接贴上来(比较简单,就是计算图片要绘制到窗体的坐标,然后把图片绘到窗体上)protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);this.BackColor=Color.Black;//绘制皮肤Graphics g=e.Graphics;//绘制窗体顶部左上角图片g.DrawImage(imgTopLeft,0,0,imgTopLeft.Width, imgTopLeft.Height);int topRightX=e.ClipRectangle.Width-imgTopRight.Width;//绘制窗体顶部右上角图片g.DrawImage(imgTopRight,topRightX,0,imgTopRight.Width, imgTopRight.Height);int topMiddleWidth=e.ClipRectangle.Width-(imgTopLeft.Width+ imgTopRight.Width)+4;//绘制窗体顶部中间图片(标题栏)formTitleMarginLeft=imgTopLeft.Width;formTitleMarginRight=topRightX;g.DrawImage(imgTopMiddle,imgTopLeft.Width,0,topMiddleWidth, imgTopMiddle.Height);//绘制窗体底部左下角图片g.DrawImage(imgBottomLeft,0,e.ClipRectangle.Height-imgBottomLeft.Height,imgBottomLeft.Width,imgBottomLeft.Height);//绘制窗体底部右下角图片g.DrawImage(imgBottonRight,e.ClipRectangle.Width-imgBottomLeft.Width,e.ClipRectangle.Height-imgBottonRight.Height, imgBottonRight.Width,imgBottonRight.Height);//绘制窗体底部中间图片g.DrawImage(imgBottonmMiddle,imgBottomLeft.Width,e.ClipRectangle.Height-imgBottonmMiddle.Height,e.ClipRectangle.Width-(imgBottomLeft.Width+imgBottomLeft.Width)+4,imgBottonmMiddle.Height);//画左右边框g.DrawImage(imgMiddleLeft,0,imgTopLeft.Height, imgMiddleLeft.Width,e.ClipRectangle.Height-(imgTopLeft.Height+ imgBottomLeft.Height));g.DrawImage(imgMiddleRight,e.ClipRectangle.Width-imgMiddleRight.Width,imgTopRight.Height,imgMiddleRight.Width,e.ClipRectangle.Height-(imgTopLeft.Height+imgBottomLeft.Height));//画右上角按钮(最小化,最大化,关闭)formMinX=topRightX;g.DrawImage(imgFormMin,topRightX,0,imgFormMin.Width, imgFormMin.Height);if(this.WindowState==FormWindowState.Maximized){imgFormMax=imgFormRestore;}elseimgFormMax=(Image)Resources.skin_btn_max;formMaxX=topRightX+imgFormMin.Width;g.DrawImage(imgFormMax,topRightX+imgFormMin.Width,0, imgFormMax.Width,imgFormMax.Height);formCloseX=topRightX+imgFormMax.Width+ imgFormMin.Width;g.DrawImage(imgFormClose,topRightX+imgFormMax.Width+ imgFormMin.Width,0,imgFormClose.Width,imgFormClose.Height);}3.当窗体大小发生变化的时候同样要重绘,所以重写OnSizeChanged的事件protected override void OnSizeChanged(EventArgs e){base.OnSizeChanged(e);Invalidate();//强制窗体重绘}OK,这样就完成了皮肤的绘制。
接下来我们解决的问题有:1.如何用鼠标拖拽改变无边框的大小2.如何用鼠标移动无边框窗体3.如何让绘制的最小化,最大化,关闭按钮执行操作(响应事件)对于第1个问题拖拽改变无边框的大小,可以重写消息处理函数WndProc(除了这个我找不到其它好的方法了,如果哪个朋友知道请告诉我一声)const int WM_NCHITTEST=0x0084;const int HTLEFT=10;const int HTRIGHT=11;const int HTTOP=12;const int HTTOPLEFT=13;const int HTTOPRIGHT=14;const int HTBOTTOM=15;const int HTBOTTOMLEFT=0x10;const int HTBOTTOMRIGHT=17;protected override void WndProc(ref Message m){base.WndProc(ref m);switch(m.Msg){case WM_NCHITTEST:Point vPoint=new Point((int)m.LParam&0xFFFF,(int)m.LParam>>16&0xFFFF);vPoint=PointToClient(vPoint);if(vPoint.X<=5)if(vPoint.Y<=5)m.Result=(IntPtr)HTTOPLEFT;else if(vPoint.Y>=ClientSize.Height-5)m.Result=(IntPtr)HTBOTTOMLEFT;else m.Result=(IntPtr)HTLEFT;else if(vPoint.X>=ClientSize.Width-5)if(vPoint.Y<=5)m.Result=(IntPtr)HTTOPRIGHT;else if(vPoint.Y>=ClientSize.Height-5)m.Result=(IntPtr)HTBOTTOMRIGHT;else m.Result=(IntPtr)HTRIGHT;else if(vPoint.Y<=5)m.Result=(IntPtr)HTTOP;else if(vPoint.Y>=ClientSize.Height-5)m.Result=(IntPtr)HTBOTTOM;break;}}第2个问题鼠标移动无边框窗体网上一般有三种方法(详见:[转]C#无边框窗体移动的三种方法)其中有两种是用WINDOWS消息机制来完成,但是我发现如果用消息机制来处理会造成鼠标的双击或者单击事件不能使用,这一点让我很纠结,所以就采用了最原始的处理方式。