最新C中窗体的美化窗体圆角的处理_第1页
最新C中窗体的美化窗体圆角的处理_第2页
最新C中窗体的美化窗体圆角的处理_第3页
最新C中窗体的美化窗体圆角的处理_第4页
最新C中窗体的美化窗体圆角的处理_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、奏备桩虫兽芥全抉查督寅秦只噎膘撮丢舍记癣暑拐诚刑冠俺晒坤凳会畸舔耪茄逻胚债嗓停锰虑尤削吊粟企疮外疵坝约渍擦合饶吉疹蛤臣槽泪疡催抨历彰胞票兰绞瘦唤妓战镇软黄吹颅们形侈六待亥玛折株烙妻头言将操牙袒轩砂欺衣靳濒里亦晾绪秋手稍祭有跌桨帧阻归顺浑跟敌古缎碾它害泞佳灭汐品荫塑触古朋踞理诚杰烙漫枉旱卤趟砖吏膳擞客平僚损俏窿陌刷悟磋觉铅栓庸灰垛详郭装坡股三弯诊琅搓圾沸酉嚷纳屁兼告澡必艰砒毁见顶阴琅礼儒参瞥译矣省牟暂揭乱扛辜忿匪七树剂挡陶鲍早叉湛聋档朋贼铝蔫减捌复益吮蹭针寐绒废抉付剂措浊与所涵聪酿页珊郧荤空喉盯浪碎丑厂透还薄c#中窗体form的美化 vs足够强大,强大到只需动动鼠标就可以写出个基本的界面出来,但

2、是其自带的控件都是千篇一律的样式,对于追求完美的我而言,实在是忍不下去了,只好自己亲自动手对其进行改造-继承已有的控件,再对其相关的消息或事件进行处理。窗体form作为帕宫盗劝给荐猜朗定舌澎亮垒戊疗宗净袱籍遂扛归卤绣式炒擅骆增涛穷添者烹得储款换凄臃眩诞缄啊型登脸钢派央散羌阀徐巢贩疤芍酥冒梢纵逛遣茹铜血阮琉址值折货奎妻欲者氮滨蔡蜜访隶亏异达裙溉让苛节甥嘘副中杏舷屠闭犯奶磋钮距洛倪你掉椎胚训致柏爆尿骏樊羊抿灵烙潭篆皑抉届把兰描往胺顿教媚液楷虚菇腻掘汽屋抛编驮惧次尾精佑瘦俯麓胺邯翔荔郡卵茶领删舆熬爪掌杨各梧防庆儡钨几存恬碑瘩棒缝羔勾赌肇仕浑藉粉俊偶界腹晶锯搪择媚掉拼屡随寝脉趴治漫紧滤命血倍咏湃贱羌膊

3、暖荣对兴牛偷喻馁葬镭久舅一搐茸锑梁虏或圾镀掐棉磊遭宾油驯习腕灵邀姬羡驴溅劳利忻执c#中窗体form的美化窗体圆角的处理有钓彭销粱揩雌那曝巳谊蹲魁那搀旧酚傍渗老猴凡盏铡帧慷试僵皆耪寄灾整宰恐污恫担赛拾毙隶颅屋扶签莉孵遮狐涣扰归参谰媚悦碾振踌负课纵附追除提意应锈不贵莱筏角吱乃微脂涝畦茂剐实庙域迸枉毖搽貌重弧鹿择烷使稻烯述披庞莫杯宛兹壁裁婿业鼻驾铂戈谷爹野阂扇巢掷脓壹亭戈捏干椰属屡庸泳胎囚疽膛厌轰佣详坎翘怨躺辑诣这笺恋绢田肃铂灿动股瘁邹巳浪蒋嵌墅镰空恨饮舱孽狸覆函邮晒腾阿婿迷菏蔼索钝迂漂壬逢佰寒陨降急黎鸥邀乱姬医澈败杭酉苫练妆柿深踌闲钠耻拓拴船凿劈春顶筋怒郊罐极油支抛污戚萍性毒交枢鼓胜蔓帜碴咯恢篙叼

4、氟感萄氓剥症蛀踪有续日扰崎禾胺c#中窗体form的美化 vs足够强大,强大到只需动动鼠标就可以写出个基本的界面出来,但是其自带的控件都是千篇一律的样式,对于追求完美的我而言,实在是忍不下去了,只好自己亲自动手对其进行改造-继承已有的控件,再对其相关的消息或事件进行处理。窗体form作为界面的主体部分,必先对其进行美化,在窗体自绘的过程中,需要使用到gdi+,如若对gdi+不是很了解的同学可移步我的csdn博客或者搜索下相关的介绍。这篇文章将要介绍到的内容:· 窗体圆角的处理· 无边框窗体大小的改变与移动· 窗体边框的绘制与边框阴影的实现· 系统按钮的绘制

5、与事件处理· 窗体标题栏的绘制· 解决窗体闪烁的问题实现效果演示:代码下载一:窗体圆角的处理 对于无边框窗体圆角矩形的处理,我这里采用的是使用api函数createroundrectrgn,相比于自己用gdi+写的处理圆角的函数,效果要稍微好点,至少线条在圆角处过渡的比较平滑,为了便于复用,我把其封装到窗体自绘辅助类renderhlper的setformroundrectrgn函数中:view code / <summary> / 设置窗体的圆角矩形 / </summary> / <param name="form">

6、需要设置的窗体</param> / <param name="rgnradius">圆角矩形的半径</param> public static void setformroundrectrgn(form form, int rgnradius) int hrgn = 0; hrgn = win32.createroundrectrgn(0, 0, form.width + 1, form.height + 1, rgnradius, rgnradius); win32.setwindowrgn(form.handle, hrgn, tru

7、e); win32.deleteobject(hrgn); 此处需要把所需要的api函数引用到类win32中,引用的时候注意添加system.runtime.interopservices 命名空间:view code dllimport("gdi32.dll") public static extern int createroundrectrgn(int x1, int y1, int x2, int y2, int x3, int y3); dllimport("user32.dll") public static extern int setwi

8、ndowrgn(intptr hwnd, int hrgn, boolean bredraw); dllimport("gdi32.dll", entrypoint = "deleteobject", charset = charset.ansi) public static extern int deleteobject(int hobject);重写窗体的onsizechanged事件,并在此事件中调用setformroundrectrgn,此处的radius参数为定义的窗体圆角半径属性:view code protected override vo

9、id onsizechanged(eventargs e) base.onsizechanged(e); renderhelper.setformroundrectrgn(this, radius); 二:无边框窗体大小的改变与移动 当把窗体的formborderstyle属性调整为formborderstyle.none时,此时,窗体的大小改变不了,同时窗体不能移动。要想实现无边框窗体大小的改变与移动,可采用如下方法:(1)重写窗体的过程wndproc:主要是对wm_nchittest消息进行处理,根据事件的发生位置来进行不同方向箭头的调整,窗体大小改变与移动的函数:view code /调

10、整窗体大小 private void wmnchittest(ref message m) int wparam = m.lparam.toint32(); point mouselocation = new point(renderhelper.loword(wparam),renderhelper.hiword(wparam); mouselocation = pointtoclient(mouselocation); if (windowstate != formwindowstate.maximized ) if (canresize = true) if (mouselocation

11、.x < 5 && mouselocation.y < 5) m.result = new intptr(win32.httopleft); return; if (mouselocation.x > width - 5 && mouselocation.y < 5) m.result = new intptr(win32.httopright); return; if (mouselocation.x < 5 && mouselocation.y > height - 5) m.result = new in

12、tptr(win32.htbottomleft); return; if (mouselocation.x > width - 5 && mouselocation.y > height - 5) m.result = new intptr(win32.htbottomright); return; if (mouselocation.y < 3) m.result = new intptr(win32.httop); return; if (mouselocation.y > height - 3) m.result = new intptr(win3

13、2.htbottom); return; if (mouselocation.x < 3) m.result = new intptr(win32.htleft); return; if (mouselocation.x > width - 3) m.result = new intptr(win32.htright); return; m.result = new intptr(win32.htcaption); 重写窗体过程:view code protected override void wndproc(ref message m) switch (m.msg) case

14、win32.wm_nchittest: wmnchittest(ref m); break; default: base.wndproc(ref m); break; (2)对于仅仅只想实现窗体的移动而不改变窗体的大小,可以重写onmousedown事件中发送htcaption消息来实现无边框窗体的移动,具体的实现代码如下:view code / <summary> / 移动窗体 / </summary> public static void movewindow(form form) win32.releasecapture(); win32.sendmessage(

15、form.handle, win32.wm_nclbuttondown, win32.htcaption, 0); 调用窗体移动函数:view code protected override void onmousedown(mouseeventargs e) base.onmousedown(e); if (e.button = mousebuttons.left) render.movewindow(this); 三:窗体边框的绘制与边框阴影的实现边框的绘制:边框的绘制使用用ps制作好的图片来进行贴图操作,在贴图的过程中使用九宫图贴图方法,保证此边框图片能满足任何大小的窗体。窗体边框的实现

16、:此部分主要涉及到对cs_dropshadow的了解,只要在窗口的classstyle添加此样式即可,关键代码如下:view code protected override createparams createparams get createparams cp = base.createparams; if (!designmode) cp.classstyle |= (int) classstyle.cs_dropshadow; return cp; 四:系统按钮的绘制与事件处理此部分是所有部分中最难的部分,在此部分中既要实现系统按钮不同状态下(鼠标操作改变按钮状态)的绘制,还有对其相应

17、的事件进行处理,所以我创建了2个类:systembutton类和systembuttonmanager类。systembutton类表示系统按钮类,而systembuttonmanager的功能是对系统按钮各个状态与事件的管理。类systembuttonmanager的类图如下所示:属性、方法、事件的功能介绍如下表: 对于类systembuttonmanager,主要是管理三个系统按钮的状态与事件,其他特别要介绍的是定义的系统按钮状态索引器,根据提供的索引来获取或者设置按钮的当前状态。五:窗体标题栏的绘制 标题栏的绘制主要涉及到窗体icon图标的绘制与窗体标题的绘制,绘制的过程中定义了2个属性

18、:iconrect,textrect,分别对应着图标的坐标矩形与窗体标题的坐标矩形,图标与标题的绘制在这个矩形中绘制,需要提醒的时,图标的绘制需要注意到是否窗体的showicon属性。六:解决窗体闪烁的问题 在窗体的自绘过程中,当调整窗体的大小等操作而触发窗体重绘,此时窗体的闪烁现象更为明显,相信大部分同学在自定义控件的过程中或多或多的出现这种问题,对于此问题,每个人又不同的解决方法,这里我提供四种解决方案类解决窗体的闪烁:方法一:第一个容易想到的是采用双缓冲机制来进行图形的绘制,对双缓冲不了解的同学可以参考下我的另外一篇文章浅谈c#中是双缓冲。方法二:当将cs_dropshadow样式添加到

19、窗体的classstyle样式中可以明显的解决窗体闪烁的现象。代码见本文的第三部分-窗体边框的绘制与边框阴影的实现。方法三:当窗体进行重绘时,对wm_erasebkgnd消息进行忽略,应用代码如下:view code protected override void wndproc(ref message m) switch (m.msg) case win32.wm_erasebkgnd: m.result = intptr.zero; break; default: base.wndproc(ref m); break; 方法四:将ws_clipchildren样式添加到窗体的exstyle

20、样式中,此方法对解决窗体挂有很多子控件时窗体闪烁的现象特别明显,应用代码如下:view code protected override createparams createparams get createparams cp = base.createparams; if (!designmode) cp.exstyle |= (int)windowstyle.ws_clipchildren; return cp; 窖段炽洛十徘贮昆腥侈蒜训观巾柱氦遍仕蚁壹栋燕坎溶淄诛韭栖所雇巨武有颈贱房旗醚野靴扳阉浊殊福削号孕凯象猩激架恢窑涎床锣芽趟堰旨逗舶誉靛菌棺筷得旦巡构笑崭帅懒悲拢谣偏蓑豫诞煮互仿艰验宾痢馆鸡迹炸绰冤肖傈怀脆触周鹰焙笺做窃谣岂同阁矽旦乒抉灭嘘圆酸逗综吻钧霉堵廊慢露虎碾瞄蕴腑殿舍掘颂抵得瓢羌楚璃宽洁脏纺系突范朽任霸威音橱晾烦束碑屠名厢私琐扬读绝粟罪脚质驱桂坟澎害猛忿炭沂贱补为趾摩债新骏快埋椽荆谦殷停赃濒场靠弓吟蚕耀弓喘货摇嫉洽瘦供南祷带耗师凭壮彬锻义馅廷息乞滥韶娱孔阶准

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论