模拟Vista侧边栏的CPU仪表盘(VC6)

简介: 在Vista系统的侧边栏有很多好用的桌面小工具,不过长期以来最吸引我的还是那个用显示的CPU和存储占用的指针仪表盘,一直觉得这是一个很不错的创意控件。所以现在我用VC6来写一个很小的对话框程序模拟这个控件。

            在Vista系统的侧边栏有很多好用的桌面小工具,不过长期以来最吸引我的还是那个用显示的CPU和存储占用的指针仪表盘,一直觉得这是一个很不错的创意控件。所以现在我用VC6来写一个很小的对话框程序模拟这个控件。作为Demo,我只是做了显示CPU的,效果如下所示:

           

            如何查询CPU占用率,这是一个比较少用到的需求(我在这里不打算详细讲解它),但对我们的Demo却是必须的,这个代码是我引用了别人的范例代码,同时为了使他能够为我所用,我适当修改了它,把它改写为两个函数。使用时只需要调用就可以得到CPU占用百分比,具体代码参见IdleInfo.h。

            使用方法时,首先调用 InitCommonData 函数,主要用于查询 NtQuerySystemInformation 函数的地址,以及获取CPU个数。

            然后我们就可以随时调用 GetCPUPercent 函数,得到的返回值就是CPU占用百分比。

 

            下面我们重点在于如何做这样一个仪表盘的效果。为此,观察控件可知,动态部分主要是指针,和下面的信息文本,其他是不变化的。所以我们首先把静态的背景制作成位图资源。并在 WM_ERASEBKGND 消息中把这个位图复制到相应的DC。

            下一步是在 WM_PAINT 消息中,绘制动态部分:指针和信息。

            对于指针的绘制,我这里采用了一种很粗糙的手法(当然和VISTA中的那个效果相差不少),即把指针用一个五边多边形近似模拟。然后绘制时,动态计算出指针的轮廓。同时,对于指针的绘制,可以有两种视觉效果。一种是比较简单的仅仅在适当位置绘制指针,但视觉上会感觉指针在“突变”。另一种是更友好也更接近现实效果的做法,即令指针平滑移动。这里当然我采用第二种方法。

            为此,我需要两个定时器(一个用于查询CPU,一个用于移动指针),两个属性(一个是当前指针指示值,一个是指针最终需要到达的指示值)来协助完成。相关代码如下:

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif CODE_窗口过程中的WM_TIMER代码片段
    case WM_TIMER:
        
switch(wParam)
        {
            
//查询CPU
        case TIMER_GETINFO:
            
//查询新的CPU占用
            m_destVal = GetCPUPercent();
            
//int temp = m_val >= 100? 100 : m_val+2;
            if(m_val != m_destVal)
            {
                
//更新显示值
                InvalidateRect(hDlg, &m_InfoRect, TRUE);
                
//平滑指针
                SetTimer(hDlg, TIMER_MOVING, 20, NULL);
            }
            
break;

            
//平滑指针定时器的处理
        case TIMER_MOVING:
            
//是否已经移动完成
            if(m_val == m_destVal)
            {
                KillTimer(hDlg, TIMER_MOVING);
                
break;
            }
            
else if(m_val < m_destVal) m_val++;
            
else m_val--;
            UpdatePointer(m_val, 
&rc);
            InvalidateRect(hDlg, 
&rc, TRUE);
            
break;
        }
        
return TRUE;

 

            最后,是源代码下载链接:

            http://files.cnblogs.com/hoodlum1980/CpuMeter.rar

            总结:在效果上我们的窗口边缘还很生硬,指针也很简陋,和vista侧边栏窗口的那种显示效果当然还有很大差距,但控件的效果是基本一致的。虽然很简陋,但该例子还是能够完整说明一些控件的基本绘制原则,例如如何防止闪烁等。

            

目录
相关文章
|
6月前
Win11、Win10 怎么让软件运行后台全部显示在任务栏上 win11任务栏展开显示所有软件图标
Win11、Win10 怎么让软件运行后台全部显示在任务栏上 win11任务栏展开显示所有软件图标
91 2
|
Windows 存储 Cloud Native
C++Qt windows系统托盘增加图标和功能
C++Qt windows系统托盘增加图标和功能
让Mac Dock栏(程序坞)只显示已打开的应用程序软件
默认Dock 栏不仅会显示用户设置为「在 Dock 中保留」的应用程序(不论打开与否)、系统项目(Finder 和废纸篓)以及堆栈,还会显示那些用户并未设置保留,却已经打开的应用程序的图标。
250 0
|
数据可视化 Windows
MFC模拟 Windows 文件可视化系统(中)
MFC模拟 Windows 文件可视化系统
229 0
MFC模拟 Windows 文件可视化系统(中)
|
数据可视化 Windows
MFC模拟 Windows 文件可视化系统(下)
MFC模拟 Windows 文件可视化系统
189 0
MFC模拟 Windows 文件可视化系统(下)
|
存储 数据可视化 算法
MFC模拟 Windows 文件可视化系统(上)
MFC模拟 Windows 文件可视化系统
223 0
MFC模拟 Windows 文件可视化系统(上)
|
IDE 测试技术 开发工具
Airtest测试Windows窗口翻车?还是想跟你们聊聊测试win窗口的一些问题
Airtest测试Windows窗口翻车?还是想跟你们聊聊测试win窗口的一些问题
733 0
使用VC做一个简单的UI界面对话框
使用VC做一个简单的UI界面对话框
1017 0
使用VC做一个简单的UI界面对话框
|
图形学 Windows
unity 实现调用Windows窗口/对话框交互
Unity调用Window窗口 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar ——...
1850 0