资源描述:
《C#中窗体Form的美化窗体圆角的处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C#中窗体Form的美化VS足够强大,强大到只需动动鼠标就可以写出个基本的界面出来,但是其自带的控件都是千篇一律的样式,对于追求完美的我而言,实在是忍不下去了,只好自己亲自动手对其进行改造----继承已有的控件,再对其相关的消息或事件进行处理。窗体Form作为界面的主体部分,必先对其进行美化,在窗体自绘的过程中,需要使用到GDI+,如若对GDI+不是很了解的同学可移步我的CSDN博客或者搜索下相关的介绍。这篇文章将要介绍到的内容:·窗体圆角的处理·无边框窗体大小的改变与移动·窗体边框的绘制与边框阴影的实现·系统按钮的绘制与事件处理·窗体标题栏的绘制·解决窗体闪烁的问题实现效果演示
2、:代码下载一:窗体圆角的处理对于无边框窗体圆角矩形的处理,我这里采用的是使用API函数CreateRoundRectRgn,相比于自己用GDI+写的处理圆角的函数,效果要稍微好点,至少线条在圆角处过渡的比较平滑,为了便于复用,我把其封装到窗体自绘辅助类RenderHlper的SetFormRoundRectRgn函数中:ViewCode//////设置窗体的圆角矩形//////需要设置的窗体///圆角矩形的半径publicstat
3、icvoidSetFormRoundRectRgn(Formform,intrgnRadius){inthRgn=0;hRgn=Win32.CreateRoundRectRgn(0,0,form.Width+1,form.Height+1,rgnRadius,rgnRadius);Win32.SetWindowRgn(form.Handle,hRgn,true);Win32.DeleteObject(hRgn);}此处需要把所需要的API函数引用到类Win32中,引用的时候注意添加System.Runtime.InteropServices命名空间:ViewCode[DllImp
4、ort("gdi32.dll")]publicstaticexternintCreateRoundRectRgn(intx1,inty1,intx2,inty2,intx3,inty3);[DllImport("user32.dll")]publicstaticexternintSetWindowRgn(IntPtrhwnd,inthRgn,BooleanbRedraw);[DllImport("gdi32.dll",EntryPoint="DeleteObject",CharSet=CharSet.Ansi)]publicstaticexternintDeleteObject(
5、inthObject);重写窗体的OnSizeChanged事件,并在此事件中调用SetFormRoundRectRgn,此处的Radius参数为定义的窗体圆角半径属性:ViewCodeprotectedoverridevoidOnSizeChanged(EventArgse){base.OnSizeChanged(e);RenderHelper.SetFormRoundRectRgn(this,Radius);}二:无边框窗体大小的改变与移动当把窗体的FormBorderStyle属性调整为FormBorderStyle.None时,此时,窗体的大小改变不了,同时窗体不能移动。
6、要想实现无边框窗体大小的改变与移动,可采用如下方法:(1)重写窗体的过程WndProc:主要是对WM_NCHITTEST消息进行处理,根据事件的发生位置来进行不同方向箭头的调整,窗体大小改变与移动的函数:ViewCode//调整窗体大小privatevoidWmNcHitTest(refMessagem){intwparam=m.LParam.ToInt32();PointmouseLocation=newPoint(RenderHelper.LOWORD(wparam),RenderHelper.HIWORD(wparam));mouseLocation=PointToClie
7、nt(mouseLocation);if(WindowState!=FormWindowState.Maximized){if(CanResize==true){if(mouseLocation.X<5&&mouseLocation.Y<5){m.Result=newIntPtr(Win32.HTTOPLEFT);return;}if(mouseLocation.X>Width-5&&mouseLocation.Y<5){m.Result=newIntPtr(Win32.HTTO