C#之Winform绘制(Graphics)清空白板的方法--磁盘空间以及内存(物理和虚拟)监控的开发

graphics.DrawString()在绘制的过程中,字符串String更新的时候会因为没有清空字符串,出现字符串的叠加在一起看不清楚的情况,因此需要在每一次的字符串的绘制前需要清空白板,以下就是清空白板的方法。

graphics.Clear(Color.White);//清空画板

其中参数Color.White是使用的颜色进行填充,可以将Winform的窗体背景设置成White的颜色,这样使用上面代码白色填充会比较和谐一点。可以自己动手试试!~

附上磁盘空间以及内存(物理和虚拟)监控窗体界面和代码:

 

using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Management;
using System.IO;
using Microsoft.VisualBasic.Devices;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            Task.Run(new Action(DisplayMemory));
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //WQL的select操作,查询电脑的磁盘信息
            SelectQuery selectQuery = new SelectQuery
            {
                QueryString = "select * from win32_logicaldisk"
            };

            ManagementObjectSearcher searcher = new ManagementObjectSearcher
            {
                Query = selectQuery
            };

            //显示电脑的磁盘信息
            foreach (ManagementObject obj in searcher.Get())
            {
                cbox_diskName.Items.Add(obj["name"].ToString());
            }
            cbox_diskName.SelectedIndex = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {

            //获取驱动器的空间总量信息
            DriveInfo driveInfo = new DriveInfo(cbox_diskName.Text);
            var totalSize = driveInfo.TotalSize;
            var totalFreeSpace = driveInfo.TotalFreeSpace;

            //绘制饼状图
            Graphics graphics = this.CreateGraphics();
            var diskProportion = (float)totalFreeSpace / (float)totalSize * 360;
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            graphics.Clear(Color.White);//清空画板
            graphics.FillPie(new SolidBrush(Color.DodgerBlue), 75, 100, 200, 200, 180, 360 - diskProportion);
            graphics.FillPie(new SolidBrush(Color.Gray), 75, 100, 200, 200, 540 - diskProportion, diskProportion);
            graphics.DrawString("已用空间:" +((float)(totalSize - totalFreeSpace) / 1024 / 1024 / 1024).ToString("F2") + "GB", new Font("宋体", 10), new SolidBrush(Color.Black), 140, 320);
            graphics.DrawString("可用空间:" + ((float)(totalFreeSpace / 1024 / 1024 / 1024)).ToString("F2") + "GB", new Font("宋体", 10), new SolidBrush(Color.Black), 140, 340);
            graphics.DrawString("容量:" + ((float)(totalSize / 1024 / 1024 / 1024)).ToString("F2") + "GB", new Font("宋体", 10), new SolidBrush(Color.Black), 140, 360);
            graphics.FillRectangle(new SolidBrush(Color.DodgerBlue), 110, 320, 25, 10);
            graphics.FillRectangle(new SolidBrush(Color.Gray), 110, 340, 25, 10);
            graphics.FillRectangle(new SolidBrush(Color.Green), 110, 360, 25, 10);

        }
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            //获取光标的X,Y轴坐标
            textBox1.Text = e.X.ToString();
            textBox2.Text = e.Y.ToString();
        }

        private void DisplayMemory()
        {
            while (true)
            {
                //获取物理内存信息
                Computer computer = new Computer();
                var totalPhysicalMemory = computer.Info.TotalPhysicalMemory;
                var availablePhysicalMemory = computer.Info.AvailablePhysicalMemory;

                //获取虚拟内存信息
                var totalVirtualMemory = computer.Info.TotalVirtualMemory;
                var availableVirtualMemory = computer.Info.AvailableVirtualMemory;

                //绘制物理内存信息
                Bitmap image = new Bitmap(panel1.Width, panel1.Height);
                Graphics graphics = Graphics.FromImage(image);
                panel1.BackColor = Color.Gray;
                var memoryProporation = (float)(totalPhysicalMemory - availablePhysicalMemory) / totalPhysicalMemory * panel1.Height;
                graphics.FillRectangle(new SolidBrush(Color.Green), 0, panel1.Height - memoryProporation, panel1.Width, memoryProporation);
                panel1.BackgroundImage = image;

                //绘制虚拟内存信息
                Bitmap image1 = new Bitmap(myPanel1.Width, myPanel1.Height);
                Graphics graphics1 = Graphics.FromImage(image1);
                myPanel1.BackColor = Color.Gray;
                var memoryProporation1 = (float)(totalVirtualMemory - availableVirtualMemory) / totalVirtualMemory * myPanel1.Height;
                graphics1.FillRectangle(new SolidBrush(Color.Green), 0, myPanel1.Height - memoryProporation1, myPanel1.Width, memoryProporation1);
                myPanel1.BackgroundImage = image1;

            }
        }
    }
}
 

注意:

1.项目-属性的设置如下:选择x86目标平台和取消勾选首选32位。

2.为减少Panel的闪烁,使用了双缓冲技术,在以上项目内右键新建一个同样命名空间的类,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    class Mypanel : Panel
    {
        public Mypanel()
        {
            //窗体双缓冲
            this.DoubleBuffered = true;
        }
    }
}
新建完这个类后,需要重新生成解决方案,此时,设计器页面的工具箱会自动生成一个新的Panel的控件,需要用新生成的Panel控件来放到窗体设计器里面监控内存(物理和虚拟)情况,因为这个新的Panel是用到了双缓冲技术,不会出现闪烁情况,有兴趣的小伙伴可以使用自带的Panel空间来创建对比看看,记得对应的代码和控件Name要同步哦,不然代码报错,细心留意即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值