首先,我们先来实现主界面的扁平化

   此处分为两个步骤,第一步是更改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;
}

  完成之后就可以啦,看看最后的效果:

  理解控件重绘或者是重写的含义之后,其他的控件也非常方便拓展与修改,达到美化效果!