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;
}

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

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

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

(0)
上一篇 2022年5月28日 下午6:00
下一篇 2022年5月28日 下午6:00


相关推荐

  • Quartz任务中调用Spring容器中bean及动态调度任务-SchedulerFactoryBean「建议收藏」

    Quartz任务中调用Spring容器中bean及动态调度任务-SchedulerFactoryBean「建议收藏」Quartz是开源任务调度框架中的翘首,它提供了强大任务调度机制,同时保持了使用的简单性。Quartz允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。此外,Quartz提供了调度运行环境的持久化机制,可以保存并恢复调度现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,Quartz还提供了组件式的侦听器、各种插件、线程池等功能。Spring为…

    2022年5月23日
    102
  • 原地算法矩阵置0_矩阵归一化处理步骤

    原地算法矩阵置0_矩阵归一化处理步骤给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。进阶:一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。你能想出一个仅使用常量空间的解决方案吗?示例 1:输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:输入:matrix

    2022年8月8日
    7
  • ubuntu卸载安装的方式

    ubuntu卸载安装的方式1、查找已经安装的插件查看全部:dpkg-l查看相关:dpkg-l|grep<筛选目标>例如:dpkg-l|grepgcc2、卸载apt-getremove<dpkg-l的结果>例如:apt-getremovelibgcc-4.8-dev注意:卸载过程中会有依赖关系而产生报错,需要自己确认相互依赖的关系,遵循…

    2022年5月29日
    36
  • WebStorm使用 webstorm快捷键

    WebStorm使用 webstorm快捷键WebStormWebStorm是JetBrains推出的一款商业的 JavaScript 开发工具任何一个编辑器都需要保存(ctrl+s),这是所有win平台上编辑类软件的特点,但是webstorm编辑文件右上角是没有那个熟悉的*的。好处:省去了ctrl+s之后,在结合Firefox的vim,基本不动鼠标就可以看到结果页面了。 坏处:没有以前的*

    2022年6月23日
    40
  • 苹果ipa软件包破解笔记

    苹果ipa软件包破解笔记

    2021年11月16日
    1.1K
  • 延时1s的延时子程序_用一个时间常数为0.35秒的一阶装置

    延时1s的延时子程序_用一个时间常数为0.35秒的一阶装置文档介绍:目录第一部分设计任务及方案1、设计题目及要求2、设计方案分析论证第二部分方案各模块分析1、被控对象分析2、测量元件热电阻及前置放大电路3、A/D转换器4、控制器(单片机)5、光隔驱动器第三部分数字控制器D(Z)的设计1、数字控制器D(Z)2、程序流程图设计第四部分可靠性和抗干扰性的分析第五部分心得体会设计任务及方案1.1设计题目及要求1、针对一个具有大纯时延时间的一阶惯性环节()温度控…

    2026年4月14日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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