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

发布时间:2025-12-09 18:43:20 浏览次数:4

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

           

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

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

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

 

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

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

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

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

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侧边栏窗口的那种显示效果当然还有很大差距,但控件的效果是基本一致的。虽然很简陋,但该例子还是能够完整说明一些控件的基本绘制原则,例如如何防止闪烁等。

            

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477