C# winform 界面美化技巧(扁平化设计)

C# winform 界面美化技巧(扁平化设计)C#winform界面美化技巧(扁平化设计)关于C#界面美化的一些小技巧在不使用第三方控件如IrisSkin的前提下,依然可以对winform做出让人眼前一亮的美化首先,我们先来实现主界面的扁平化此处分为两个步骤,第一步是更改winform自带的MainForm窗体属性,第二步是添加窗体事件。将主窗体FormBorderStyle更改为None,这样就得到了一个无边框的窗体(w…

大家好,又见面了,我是你们的朋友全栈君。

C# winform 界面美化技巧(扁平化设计

关于C#界面美化的一些小技巧
在不使用第三方控件如 IrisSkin 的前提下,依然可以对winform做出让人眼前一亮的美化
在这里插入图片描述
首先,我们先来实现主界面的扁平化

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

完成之后就可以啦,看看最后的效果:
在这里插入图片描述
  理解控件重绘或者是重写的含义之后,其他的控件也非常方便拓展与修改,达到美化效果!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140153.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Linux下的文本编辑器介绍「建议收藏」

    Linux下的文本编辑器介绍「建议收藏」关于文本编辑器文本编辑器有很多,比如图形模式的gedit、kwrite、OpenOffice……,文本模式下的编辑器有vi、vim(vi的增强版本)和nano……vi和vim是我们在Linux中最常用的编辑器。我们有必要介绍一下vi(vim)最简单的用法,以让Linux入门级用户在最短的时间内学会使用它。 nano工具和DOS操作系统下的edit操作相似,使用简单…

  • MySQL慢查询日志分析详解[通俗易懂]

    MySQL慢查询日志分析详解[通俗易懂]MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢…

    2022年10月12日
  • 两个求和符号如何用计算机,计算:两个求和符号∑∑怎么办「建议收藏」

    两个求和符号如何用计算机,计算:两个求和符号∑∑怎么办「建议收藏」先将其中一个未知数当常量,另一个未知数从1至n依次递加后各项式子相加。然后再将另一个未知数从1至n依次递加后各项式子相加便是结果。∑是一个求和符号,汉语名称为西格玛(大写Σ,小写σ)。第十八个希腊字母。在希腊语中,如果一个单字的最末一个字母是小写sigma,要把该字母写成ς,在现代的希腊数字代表6。大写Σ用于数学上的总和符号,比如:∑Pi,其中i=1,2,…,T,即为求P1+P2+…

    2022年10月11日
  • c++字符串转json_java对象转换成字符串

    c++字符串转json_java对象转换成字符串往往会有这么一种情景:有一个自定义的json或者json数组的字符串,希望转换成对应的对象。由于程序对于自定义的JSON格式并不清楚,所以直接ToObject()或者ToList()均会失败。这时我们要做的就是让程序知道我们自定义的json到底是什么样的。如下://数据库中某个字段内容如下,NeedToJson用于接收该字段值//[{“ProjectName”:”锅炉整体是否有明显的…

  • 海量存储系列下–转载,值得一读

    海量存储系列下–转载,值得一读

  • JS全局变量和局部变量

    JS全局变量和局部变量全局变量和局部变量在看了一个博主写的关于js全局变量的的介绍后,自己也跟着做了一下,并且记录在这里。原博客地址:谈谈JS的全局变量跟局部变量。博主说的比较详细,也比我的表达好,如果不是没耐心,建议去看看原博主的文章先上一段代码:<scripttype=”text/javascript”>vara=1;functiontest(){ alert(a); a=4; aler

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号