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要同步哦,不然代码报错,细心留意即可。