Hoodlum1980 (fafa)'s Technological Blog

Languages mainly using and digging: C / CPP, ASM, C#, Python. Other languages:Java.

博客园 首页 新随笔 联系 订阅 管理

            在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代码片段

 

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

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

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

            

posted on 2009-04-18 04:28  hoodlum1980  阅读(4330)  评论(0编辑  收藏  举报