实例介绍
【实例截图】
【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace CNPOPSOFT.Controls
{
public partial class VistaCPUInfo : UserControl
{
PerformanceCounter pc = null;
float percentOfCPU = 0, percentOfMemory = 0; //CPU和内存分别所占百分比,0~99
bool firstRun = true;
Timer timer = new Timer();
Timer timerCPU = new Timer();
Timer timerMem = new Timer();
float cpuAimAngle = 0, memAimAngle = 0, cpuCurAngle = 0, memCurAngle = 0;
StringFormat format = new StringFormat();
Font textFont = new Font("Arial", 8, FontStyle.Bold);
SolidBrush textBrush = new SolidBrush(Color.White);
public enum VistaCPUInfoStyle
{
经典, 酷黑
}
private VistaCPUInfoStyle style = VistaCPUInfoStyle.经典;
/// <summary>
/// 风格
/// </summary>
public VistaCPUInfoStyle Style
{
get { return style; }
set { style = value; }
}
private CustomRectangle positionRect = new CustomRectangle();
/// <summary>
/// 时钟的位置矩形
/// </summary>
public CustomRectangle PositionRect
{
get { return positionRect; }
set { positionRect = value; }
}
#region 只读属性
private Image Image
{
get
{
if (style == VistaCPUInfoStyle.酷黑)
return global::CNPOPSOFT.Controls.Properties.Resources.back_cool_lrg;
else
return global::CNPOPSOFT.Controls.Properties.Resources.back_lrg;
}
}
private Image ImageDial
{
get
{
if (style == VistaCPUInfoStyle.酷黑)
return global::CNPOPSOFT.Controls.Properties.Resources.dial_cool_lrg;
else
return global::CNPOPSOFT.Controls.Properties.Resources.dial_lrg;
}
}
private Image ImageDialDot
{
get
{
if (style == VistaCPUInfoStyle.酷黑)
return global::CNPOPSOFT.Controls.Properties.Resources.dialdot_cool_lrg;
else
return global::CNPOPSOFT.Controls.Properties.Resources.dialdot_lrg;
}
}
private Image ImageDialSmall
{
get
{
if (style == VistaCPUInfoStyle.酷黑)
return global::CNPOPSOFT.Controls.Properties.Resources.dial_cool_lrg_sml;
else
return global::CNPOPSOFT.Controls.Properties.Resources.dial_lrg_sml;
}
}
private Image ImageGlass
{
get
{
if (style == VistaCPUInfoStyle.酷黑)
return global::CNPOPSOFT.Controls.Properties.Resources.glass_cool_lrg;
else
return global::CNPOPSOFT.Controls.Properties.Resources.glass_lrg;
}
}
#endregion
[DllImport("kernel32")]
public static extern void GetWindowsDirectory(StringBuilder WinDir, int count);
[DllImport("kernel32")]
public static extern void GetSystemDirectory(StringBuilder SysDir, int count);
[DllImport("kernel32")]
public static extern void GetSystemInfo(ref CPU_INFO cpuinfo);
[DllImport("kernel32")]
public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);
[DllImport("kernel32")]
public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);
//定义CPU的信息结构
[StructLayout(LayoutKind.Sequential)]
public struct CPU_INFO
{
public uint dwOemId;
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
public uint dwNumberOfProcessors;
public uint dwProcessorType;
public uint dwAllocationGranularity;
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
//定义内存的信息结构
[StructLayout(LayoutKind.Sequential)]
public struct MEMORY_INFO
{
public uint dwLength;
public uint dwMemoryLoad;
public uint dwTotalPhys;
public uint dwAvailPhys;
public uint dwTotalPageFile;
public uint dwAvailPageFile;
public uint dwTotalVirtual;
public uint dwAvailVirtual;
}
//定义系统时间的信息结构
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME_INFO
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
}
public VistaCPUInfo()
{
InitializeComponent();
format.LineAlignment = StringAlignment.Center;
format.Alignment = StringAlignment.Center;
this.timer.Interval = 1000;
this.timer.Tick = new EventHandler(timer_Tick);
timerCPU.Interval = 100;
timerMem.Interval = 100;
timerCPU.Tick = new EventHandler(timerCPU_Tick);
timerMem.Tick = new EventHandler(timerMem_Tick);
this.DoubleBuffered = true;
this.BackColor = Color.Transparent;
this.Paint = new PaintEventHandler(VistaCPUInfo_Paint);
this.Resize = new EventHandler(VistaCPUInfo_Resize);
this.MouseUp = new MouseEventHandler(VistaCPUInfo_MouseUp);
}
void VistaCPUInfo_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right) contextMenuStrip1.Show(this, e.Location);
}
void timer_Tick(object sender, EventArgs e)
{
if (pc == null) pc = new PerformanceCounter("Processor", "% Processor Time", "_Total");
float cpu = 30f, mem = 0f;
if (!firstRun) cpu = (float)pc.NextValue();
MEMORY_INFO MemInfo;
MemInfo = new MEMORY_INFO();
GlobalMemoryStatus(ref MemInfo);
mem = (float)MemInfo.dwMemoryLoad;
if (firstRun || percentOfCPU != cpu)
{
percentOfCPU = cpu;
float i = (float)Math.Round(percentOfCPU * 2.5) - 125f;
timerCPU.Enabled = false;
if ((i >= -360) && (i <= 360))
cpuAimAngle = i;
else
cpuAimAngle = 0;
timerCPU.Enabled = true;
}
if (firstRun || percentOfMemory != mem)
{
percentOfMemory = mem;
timerMem.Enabled = true;
float i = (float)Math.Round(percentOfMemory * 2.5) - 125f;
timerMem.Enabled = false;
memAimAngle = i;
timerMem.Enabled = true;
}
if (firstRun) firstRun = false;
}
void timerMem_Tick(object sender, EventArgs e)
{
float i;
if (memCurAngle > memAimAngle)
{
float intRotateStep = (float)Math.Max(1, Math.Round(Math.Abs(Math.Abs(memAimAngle) - Math.Abs(memCurAngle)) / 10d));
i = memCurAngle - intRotateStep;
if (i <= memAimAngle)
{
timerMem.Enabled = false;
memCurAngle = memAimAngle;
}
else
memCurAngle = i;
}
else
{
float intRotateStep = (float)Math.Max(1, Math.Round(Math.Abs(Math.Abs(memAimAngle) - Math.Abs(memCurAngle)) / 10d));
i = memCurAngle intRotateStep;
if (i >= memAimAngle)
{
timerMem.Enabled = false;
memCurAngle = memAimAngle;
}
else
{
if ((i >= -360) && (i <= 360)) memCurAngle = i;
}
}
//this.Invalidate();
}
void timerCPU_Tick(object sender, EventArgs e)
{
float i;
if (cpuCurAngle > cpuAimAngle)
{
float intRotateStep = (float)Math.Max(1, Math.Round(Math.Abs(Math.Abs(cpuAimAngle) - Math.Abs(cpuCurAngle)) / 10d));
i = cpuCurAngle - intRotateStep;
if (i <= cpuAimAngle)
{
timerCPU.Enabled = false;
cpuCurAngle = cpuAimAngle;
}
else
cpuCurAngle = i;
}
else
{
float intRotateStep = (float)Math.Max(1, Math.Round(Math.Abs(Math.Abs(cpuAimAngle) - Math.Abs(cpuCurAngle)) / 10d));
i = cpuCurAngle intRotateStep;
if (i >= cpuAimAngle)
{
timerCPU.Enabled = false;
cpuCurAngle = cpuAimAngle;
}
else
{
if ((i >= -360) && (i <= 360)) cpuCurAngle = i;
}
}
this.Invalidate(positionRect.ToRectangle());
}
void VistaCPUInfo_Resize(object sender, EventArgs e)
{
positionRect.Width = 202;
positionRect.Height = 159;
positionRect.Top = (int)(this.ClientSize.Height < 159 ? 0 : (this.ClientSize.Height - 159) / 2f);
positionRect.Left = (int)(this.ClientSize.Width < 202 ? 0 : (this.ClientSize.Width - 202) / 2f);
if (!this.timer.Enabled) this.timer.Enabled = true;
this.Invalidate();
}
void VistaCPUInfo_Paint(object sender, PaintEventArgs e)
{
e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
//背景
e.Graphics.DrawImage(Image, (int)positionRect.X, (int)positionRect.Y, 198, 159);
//指针
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(positionRect.X 68f, positionRect.Y 82f);
e.Graphics.RotateTransform(cpuCurAngle);
e.Graphics.DrawImage(ImageDial, -5, -49, 10, 98);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(positionRect.X 143f, positionRect.Y 50f);
e.Graphics.RotateTransform(memCurAngle);
e.Graphics.DrawImage(ImageDialSmall, -5, -35, 10, 70);
e.Graphics.ResetTransform();
//盖板
e.Graphics.DrawImage(ImageDialDot, (int)positionRect.X, (int)positionRect.Y, 198, 150);
//文字
RectangleF rect = new RectangleF((int)positionRect.X 53, (int)positionRect.Y 107, 35, 15);
e.Graphics.DrawString(((int)percentOfCPU).ToString() "%", textFont, textBrush, rect, format);
rect = new RectangleF((int)positionRect.X 127, (int)positionRect.Y 66, 35, 13);
e.Graphics.DrawString(((int)percentOfMemory).ToString() "%", textFont, textBrush, rect, format);
//玻璃
e.Graphics.DrawImage(ImageGlass, (int)positionRect.X, (int)positionRect.Y, 198, 159);
}
private void mnu经典_Click(object sender, EventArgs e)
{
this.style = VistaCPUInfoStyle.经典;
this.Invalidate();
}
private void mnu酷黑_Click(object sender, EventArgs e)
{
this.style = VistaCPUInfoStyle.酷黑;
this.Invalidate();
}
}
}
标签: 仪表盘
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论