首先,我们先来实现主界面的扁平化
此处分为两个步骤,第一步是更改winform自带的mainform窗体属性,第二步是添加窗体事件。
- 将主窗体formborderstyle更改为none,这样就得到了一个无边框的窗体(winform自带边框太丑。。)
- 调节背景色,建议找到自己喜欢的颜色,然后使用取色器(我用的是按键精灵自带的取色板)取得想要的rgb参数,输入到backcolor属性之中
- 在主窗体的mouse_down中添加如下事件,实现窗体随意拖动:
[dllimport("user32.dll")] public static extern bool releasecapture(); [dllimport("user32.dll")] [dllimport("user32.dll")] public static extern bool sendmessage(intptr hwnd, int wmsg, int wparam, int lparam); public const int wm_syscommand = 0x0112; public const int sc_move = 0xf010; public const int htcaption = 0x0002; /// <summary> /// 为了是主界面能够移动 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void mainform_mousedown(object sender, mouseeventargs e) { releasecapture(); sendmessage(this.handle, wm_syscommand, sc_move + htcaption, 0); }
- 添加最小化、退出事件的按钮,背景色backcolor和字体色forecolor设置为与界面颜色较为搭配的,将按钮的flatstyle设置为popup,它会自己随着界面风格调整哦~~最小化和退出的代码如下:
this.windowstate = formwindowstate.minimized; this.close();
到此为止主窗体的美化以及基本功能实现完毕
窗体基本控件实现美化
tabcontrol美化
通过tabcontrol的drawitem事件,来达到改变tabpage字体、字体颜色以及背景色的目的
private void tabcontrol1_drawitem(object sender, drawitemeventargs e) { solidbrush back = new solidbrush(color.fromargb(45, 45, 48)); solidbrush white = new solidbrush(color.fromargb(122, 193, 255)); rectangle rec = tabcontrol1.gettabrect(0); e.graphics.fillrectangle(back, rec); rectangle rec1 = tabcontrol1.gettabrect(1); e.graphics.fillrectangle(back, rec1); stringformat sf = new stringformat(); sf.alignment = stringalignment.center; for (int i = 0; i < tabcontrol1.tabpages.count; i++) { rectangle rec2 = tabcontrol1.gettabrect(i); e.graphics.drawstring(tabcontrol1.tabpages[i].text, new font("微软雅黑", 9), white, rec2, sf); } }
datagridview美化
- 通过设置columnheadersdefaultcellstyle,来改变列标题的背景、字体和颜色
- 通过设置defaultcellstyle,来改变单元格背景、字体和颜色
- 通过设置rowheadersdefaultcellstyle,来改变行标题的背景、字体和颜色
progressbar美化
很多人反映winform的进度条设置backcolor和forecolor属性,不会产生效果,进度条颜色不会变。因为进度条progressbar由于是虚拟模式下运行的,所以调整backcolor和forecolor都不会产生效果,它仍然会根据windows的主题来更改,为了使其按照我们想要的颜色来显示,我们可以将虚拟模式的命令去掉,在program.cs中,注释掉如下内容:
using system; using system.windows.forms; namespace 界面美化 { static class program { [stathread] static void main() { //application.enablevisualstyles();//此行为允许虚拟模式运行的命令,我们把它注释掉 application.setcompatibletextrenderingdefault(false); application.run(new form1()); } } }
但是这样的话会导致其他控件形状或者风格发生一些改变,个人不推荐上述方案,更加推荐通过重写progressbar的onepaint方法来改变它的颜色(前景色和背景色)。在此我们有如下代码
using system.windows.forms; using system.drawing; namespace 界面美化 { class myprogressbar:progressbar //新建一个myprogressbar类,它继承了progressbar的所有属性与方法 { public myprogressbar() { base.setstyle(controlstyles.userpaint, true);//使控件可由用户自由重绘 } protected override void onpaint(painteventargs e) { solidbrush brush = null; rectangle bounds = new rectangle(0, 0, base.width, base.height); e.graphics.fillrectangle(new solidbrush(this.backcolor), 1, 1, bounds.width - 2, bounds.height - 2);//此处完成背景重绘,并且按照属性中的backcolor设置背景色 bounds.height -= 4; bounds.width = ((int)(bounds.width * (((double)base.value) / ((double)base.maximum)))) - 4;//是的进度条跟着progressbar.value值变化 brush = new solidbrush(this.forecolor); e.graphics.fillrectangle(brush, 2, 2, bounds.width, bounds.height);//此处完成前景重绘,依旧按照progressbar的属性设置前景色 } } }
完成以上步骤之后,我们如何在界面中插入自己的进度条呢?“我们可以先插入一个winform自带的progressbar,调整好位置,forecolor,backcolor属性,然后进入窗体的designer程序中做如下修改:
//private system.windows.forms.progressbar progressbar1;//注释此句 private myprogressbar progressbar1; //新添此句,添加新的控件myprogressbar private void initializecomponent() { //this.progressbar1 = new system.windows.forms.progressbar();//注释此句 this.progressbar1 = new 界面美化.myprogressbar();//新添此句,此处对myporgressbar实例化 this.suspendlayout(); this.progressbar1.location = new system.drawing.point(137, 68); this.progressbar1.name = "progressbar1"; this.progressbar1.size = new system.drawing.size(100, 23); this.progressbar1.tabindex = 0; }
完成之后就可以啦,看看最后的效果:
理解控件重绘或者是重写的含义之后,其他的控件也非常方便拓展与修改,达到美化效果!
黄山市民网:https://www.huangshanshimin.com/